我的代码大致看起来像这样(整个代码在这里复制有点太长了):
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'
并且如果我尝试匹配()与此匹配则不匹配。这是制表符和换行符的问题,如果是,我该怎么办?
答案 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'