【问题标题】:Matching Popen.communicate() output with regular expressions doesn't work将 Popen.communicate() 输出与正则表达式匹配不起作用
【发布时间】:2010-10-13 05:50:03
【问题描述】:

我的代码大致是这样的(整个代码有点太长,无法在此处复制):

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 语句中复制标准输出并将上述脚本中的字符串用作标准输出的值,则它匹配。所以正则表达式模式应该没问题。另外,如果我从 stdin (stdout = sys.input.read()) 读取字符串,它会再次起作用。

我也尝试过 rstrip() 标准输出,但这也无济于事(此外, match() 不应该让这变得不必要吗?)。

当我用 repr() 打印标准输出时,字符串看起来像

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

如果我尝试 match() 到这个它不匹配。这是制表符和换行符的问题吗?如果是,我该怎么办?

【问题讨论】:

  • @Makis:repr(stdout).strip() 不起作用?
  • 信息不足。转储 stdout 的值:print repr(stdout),并完全消除 Popen 调用:stdout = output_of_repr,以独立的方式重现它。如果这不能告诉您发生了什么,请向我们展示该代码,以便我们实际运行它并查看发生了什么。
  • @Glenn Maynard:嗯,它清楚地说“不起作用”!我的意思是,你还需要什么?
  • Glenn:正如我所说,我已经尝试匹配标准输出,如果我手动设置它而不是从管道中读取它,它就会匹配。所以实际上我已经按照你的建议做了,但也许我的问题不够清楚(“..but if I copy the stdout from the print statement..”部分是我试图解释这一点。
  • 你根本没有按照我说的去做。同样,向我们展示该代码,以便我们实际运行它并查看发生了什么

标签: python regex subprocess stdout


【解决方案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() 看看是否有什么不同。

【讨论】:

  • 我无法复制和粘贴,因为我正在执行此操作的机器不在网络中,所以我必须手动输入。我修正了这些错别字,感谢您发现它们。
【解决方案2】:

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

如果是这样,您可能想要执行 re.search(匹配任意位置)而不是 re.match(匹配开头)或删除这些前导字符。

【讨论】:

  • 我用 repr() 检查了输出,它没有显示任何前导空格。我编辑了我的问题以显示 repr() 打印的内容。
【解决方案3】:

您的正则表达式有一些随机字符,正确版本的所有字符都匹配:

>>> 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'

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-12-29
    • 2014-09-03
    • 1970-01-01
    • 2018-04-15
    • 1970-01-01
    • 1970-01-01
    • 2023-01-22
    相关资源
    最近更新 更多