首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python:列出对pcregrep多行的Subprocess调用的匹配模式

Python:列出对pcregrep多行的Subprocess调用的匹配模式
EN

Stack Overflow用户
提问于 2017-03-21 22:00:25
回答 2查看 310关注 0票数 0

TLDR:是否有一种清晰的方法可以为subprocess.check_output('pcregrep‘、'-M’、'-e‘、模式、文件)列出条目?

我使用python的subprocess.check_output()来调用pcregrep -M。通常,我会通过调用splitlines()来分离结果,但是由于我正在寻找一个多行模式,这是行不通的。我很难找到一种清晰的方法来创建匹配模式的列表,其中列表的每个条目都是一个单独的匹配模式。

下面是一个简单的示例文件--我正在用pcgrep‘’ing

代码语言:javascript
复制
module test_module(
    input wire in0,
    input wire in1,
    input wire in2,
    input wire cond,
    input wire cond2,
    output wire out0,
    output wire out1
);

assign out0 = (in0 & in1 & in2);
assign out1 = cond1 ? in1 & in2 :
              cond2 ? in1 || in2 :
              in0;

下面是我的python代码

代码语言:javascript
复制
#!/usr/bin/env python
import subprocess, re

output_str = subprocess.check_output(['pcregrep', '-M', '-e',"^\s*assign\\s+\\bout0\\b[^;]+;", 
                                     "/home/<username>/pcregrep_file.sv"]).split(';')

# Print out the matches
for idx, line in enumerate(output_str):
    print "output_str[%d] = %s" % (idx, line)

# Clear out the whitespace list entries                           
output_str = [line for line in output_str if re.match(\S+, line)]

这是输出

代码语言:javascript
复制
output_str[0] = 
assign out0 = in0 & in1 & in2
output_str[1] = 
assign out1 = cond1 ? in1 & in2 :
              cond2 ? in1 || in2 :
              in0
output_str[2] = 

如果我能做些像

代码语言:javascript
复制
output_list = subprocess.check_output('pcregrep', -M, -e, <pattern>, <file>).split(<multiline_delimiter>)

无需创建垃圾来清理(空白列表条目),甚至不需要为split()设置一个与模式无关的分隔符。

有没有一种干净的方法来创建匹配的多行模式的列表?

EN

回答 2

Stack Overflow用户

发布于 2017-03-21 22:24:55

Per Casimir et Hippolyte的评论和非常有用的帖子如何在不将文件全部读入内存的情况下对整个文件进行re.search或re.match?,我在文件中使用re而不是对pcregrep的外部调用并使用re.findall(pattern, file, re.MULTILINE)

完整的解决方案(只稍微修改引用的帖子)

代码语言:javascript
复制
#!/usr/bin/env python
import re, mmap

filename = "/home/<username>/pcregrep_file.sv"
with open(filename, 'r+') as f:
    data = mmap.mmap(f.fileno(), 0)
    output_str = re.findall(r'^\s*assign\s+\bct_ela\b[^;]+;', data, re.MULTILINE)
    for i, l in enumerate(output_str):
    print "output_str[%d] = '%s'" % (i,l)

它创建了所需的列表。

票数 1
EN

Stack Overflow用户

发布于 2017-03-21 22:29:18

别干那事。如果由于某种原因无法使用Python正则表达式模块,只需使用pcre的Python绑定即可。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42938937

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档