0

TLDR:有没有一种干净的方法来为 subprocess.check_output('pcregrep', '-M', '-e', pattern, file) 制作条目列表?

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

这是一个简单的示例文件,我正在 pcgrep'ing

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代码

#!/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)]

这是输出

output_str[0] = 
assign out0 = in0 & in1 & in2
output_str[1] = 
assign out1 = cond1 ? in1 & in2 :
              cond2 ? in1 || in2 :
              in0
output_str[2] = 

如果我能做类似的事情就好了

output_list = subprocess.check_output('pcregrep', -M, -e, <pattern>, <file>).split(<multiline_delimiter>)

没有创建垃圾来清理(空白列表条目),甚至没有一个split()独立于模式的分隔符。

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

4

2 回答 2

1

根据 Casimir et Hippolyte 的评论和非常有用的帖子, 如何在不将其全部读入内存的情况下重新搜索或重新匹配整个文件?,我使用re而不是对 pcregrep 的外部调用读取文件并使用re.findall(pattern, file, re.MULTILINE)

完整解决方案(仅略微修改了引用的帖子)

#!/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)

这将创建所需的列表。

于 2017-03-21T22:24:55.790 回答
0

不要那样做。如果由于某种原因不能使用 Python 正则表达式模块,只需使用pcre 的 Python 绑定即可。

于 2017-03-21T22:29:18.063 回答