使用正则表达式匹配Popen.communicate()输出无效

1 投票
3 回答
1935 浏览
提问于 2025-04-16 05:24

我有一段代码,大致是这样的(整个代码有点长,不能全部复制过来):

import re
from subprocess import Popen, PIPE

goodOutput = re.compile(r'\S+: 0x[0-9a-fA-F]{8} \d \d\s+->\s+0x[0-9a-fA-F]{8}')

p = Popen(['/tmp/myexe', param], stdout=PIPE, stderr=PIPE, cwd='/tmp')

stdout, stderr = p.communicate()

ret = goodOutput.match(stdout)
if ret == None:
   print "No match in: " + stdout

match() 这个函数没有匹配到,但如果我把打印语句的输出复制过来,然后在上面的脚本中把这个字符串作为 stdout 的值,它就能匹配了。所以正则表达式的模式应该没问题。另外,如果我从标准输入读取字符串(stdout = sys.input.read()),它也能正常工作。

我也试着用 rstrip() 去掉 stdout 的末尾空白,但这也没什么帮助(而且,match() 不应该让这个变得多余吗?)。

当我用 repr() 打印 stdout 的时候,字符串看起来是这样的:

'xxx[a]: 0xff2eff00 4 7\t->\t0xff2eff00\n'

如果我尝试对这个进行 match(),它又匹配不上。这是因为制表符和换行符的问题吗?如果是的话,我该怎么做呢?

3 个回答

0

你的正则表达式里有一些多余的字符,正确的版本可以让所有内容都匹配上:

>>> s = 'xxx[a]: 0xff2eff00 4 7\t->\t0xff2eff00\n'
>>> re.match(r'\S+: 0x[0-9a-f]{8} \d \d\s+->\s+0x[0-9a-f]{8}', s, re.I).group()
'xxx[a]: 0xff2eff00 4 7\t->\t0xff2eff00'
0

你确定在输出的内容前面没有空格或者其他看不见的字符吗?如果你复制粘贴后面的内容,但没有这些字符,那就能解释为什么你手动测试的时候能成功。

如果真是这样的话,或许你可以用 re.search(在任何地方匹配)来替代 re.match(只在开头匹配),或者干脆去掉这些前面的字符。

1

你的正则表达式里可能还有拼写错误或者其他问题,导致它无法匹配(比如多余的 },或者空格太多)。

你可以试试

goodOutput = re.compile(r"\s*[^:]:s*0x[0-9a-fA-F]{8}\s+\d\s+\d\s+->\s+0x[0-9a-fA-F]{8}"`

看看这样是否有帮助。

另外,试试 re.search()re.match(),看看这两者有什么不同。

撰写回答