Python:为子进程调用制作匹配模式列表调用pcregrep多行

时间:2017-03-21 22:00:25

标签: python python-2.7 subprocess pcregrep

TLDR:是否有一种干净的方法可以为subprocess.check_output创建一个条目列表(' pcregrep',' -M',' -e&# 39;,模式,文件)?

我使用python' Type来呼叫subprocess.check_output()。通常情况下,我会通过调用pcregrep -M来分隔结果,但由于我正在寻找多线模式,因此无法正常工作。我找不到创建匹配模式列表的简洁方法,其中列表的每个条目都是单独的匹配模式。

这是一个简单的示例文件我是pcgrep'

splitlines()

这里(我的一些)python代码

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;

这是输出

#!/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>) 的分隔符,这与模式无关。

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

2 个答案:

答案 0 :(得分:1)

Per Casimir et Hippolyte的评论,以及非常有用的帖子How do I re.search or re.match on a whole file without reading it all into memory?,我使用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)

创建所需的列表。

答案 1 :(得分:0)

不要这样做。如果由于某种原因无法使用Python正则表达式模块,只需使用Python bindings for pcre