繁体   English   中英

Python多行模式匹配

[英]Python multi-line pattern matching

我正在尝试通过python使用shell命令来匹配多行模式。

我可以使用shell命令进行匹配,但是无法通过Python subprocess.call或os.system模块传递此命令。

我的文件如下所示:

(CELL
  (CELLTYPE "NAND_2X1")
  (INSTANCE U2)
  (DELAY
    (ABSOLUTE
    (IOPATH A1 ZN (0.02700::0.02700) (0.01012::0.01012))
    (IOPATH A2 ZN (0.02944::0.02944) (0.00930::0.00930))
    )
  )
)

不,我正在尝试提取以下内容:

  (INSTANCE U2)
  (DELAY
    (ABSOLUTE
    (IOPATH A1 ZN (0.02700::0.02700) (0.01012::0.01012))
    (IOPATH A2 ZN (0.02944::0.02944) (0.00930::0.00930))
    )
  )

使用此正则表达式:

pcregrep -M -n 'INSTANCE U2((?!^\)).*\n)+' sdf/c1_syn_buf2.sdf

其中U2是搜索字符串,而sdf / c1_syn_buf2.sdf是文件名

在Python中,我定义了一个函数,我将多次将该操作传递给搜索字符串和文件名。

我无法使用以下命令成功将其作为shell命令执行:

>>>b = subprocess.call(['pcregrep','-M','-n','INSTANCE '+arg, '\)((?!^\).*\n)+ '+file ])
pcregrep: Failed to open \)((?!^\).*
)+ /home/sanjay/thesis/code/sdf/c7552_syn_buf0.sdf: No such file or directory

当我实际输入参数(在这种情况下为U2)名称和文件名时,便能够获得所需的输出。

编辑如果pcregrep不够友好,这是awk命令:

awk '/INSTANCE U2/,/^)\n?/' sdf/c1_syn_buf2.sdf

返回相同。

有人可以帮我吗?

仅查看原始命令行,并将调用的格式设置为每行一个arg,不是吗?

b = subprocess.call(
['pcregrep',
    '-M',
    '-n',
    'INSTANCE {}\)((?!^\)).*\n)+ '.format(arg),
    file ])

我对括号和反斜杠不太确定。 这些在正则表达式中总是有些棘手。 您可能需要摆弄一些它们才能确切地得到想要的东西(在python文档中查找r''regex字符串类型)

看起来我需要使用格式说明符%s

它在我使用时有效:

b = subprocess.check_output("pcregrep -M -n 'INSTANCE '%s'((?!^\)).*\n)+' {} ".format(file) %arg,shell=True)

这样,我就可以将变量b完全匹配

我使用%s传递参数,并使用{} .format方法传递文件名

要运行shell命令:

$ pcregrep -M -n 'INSTANCE U2((?!^\)).*\n)+' sdf/c1_syn_buf2.sdf

在Python中:

from subprocess import check_output as qx

output = qx(['pcregrep', '-M', '-n', r'INSTANCE {}((?!^\)).*\n)+'.format(arg),
             path_to_sdf])
  • 使用r''文字或将所有反斜杠加倍
  • 将每个shell参数作为单独的列表项传递

另外,您不需要pcregrep ,可以在Python中搜索文件:

import re
from mmap import ACCESS_READ, mmap

with open(path_to_sdf) as f, mmap(f.fileno(), 0, access=ACCESS_READ) as s:
    # arg = re.escape(arg) # call it if you want to match arg verbatim
    output = re.findall(r'INSTANCE {}((?!^\)).*\n)+'.format(arg).encode(), s,
                        flags=re.DOTALL | re.MULTILINE)

mmap用于容纳不适合内存的文件。 它也可能在Windows上运行得更快。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM