【发布时间】:2014-09-19 20:48:58
【问题描述】:
我正在尝试通过 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
返回相同。
有人可以帮我解决这个问题吗?
【问题讨论】:
-
我想你只是有一个错字: .*\n)+ '+file 它可能应该是 .*\n)+ ',文件用逗号而不是加号
-
@rkh 不是错字,括号里的内容基本上是
(.*\n)+,我添加了(?!\)),表示匹配只需要在以@987654328开头的行之前进行遇到@。 -
我认为,分隔 arg 和 ') 的逗号也应该是 +,以便列表中的元素是子进程调用的单个参数
标签: python subprocess pcregrep