使用正则表达式匹配Popen.communicate()输出无效
我有一段代码,大致是这样的(整个代码有点长,不能全部复制过来):
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()
,看看这两者有什么不同。