将Popen.communicate()输出与正则表达式匹配不起作用

时间:2010-10-13 05:50:04

标签: python regex subprocess stdout

我的代码大致看起来像这样(整个代码在这里复制有点太长了):

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()与此不匹配,但如果我从print语句复制stdout并在上面的脚本中使用该字符串作为stdout的值,则匹配。所以regexp模式应该没问题。另外,如果我从stdin(stdout = sys.input.read())读取字符串,它又会起作用。

我也尝试过rstrip()stdout,但这也没有帮助(另外,不应该匹配()使这不必要?)。

当我用repr()打印stdout时,字符串看起来像

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

并且如果我尝试匹配()与此匹配则不匹配。这是制表符和换行符的问题,如果是,我该怎么办?

3 个答案:

答案 0 :(得分: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(),看看是否有任何区别。

答案 1 :(得分:0)

您确定stdout中没有前导空格或此类不可见字符吗?如果您复制粘贴后面的内容而不是这些字符,则可以解释为什么您的“手动”测试有效。

如果是这样,您可能希望执行re.search(在任何地方匹配)而不是re.match(在开始时匹配)或删除这些主要字符。

答案 2 :(得分: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'