【问题标题】:Python - regex from bye like-objectPython - 来自类似对象的正则表达式
【发布时间】:2017-07-13 16:11:53
【问题描述】:

我在windows中使用如下代码:

hostname = Popen(['hostname'], stdout=PIPE, stderr=PIPE)
stdout, stderr = process.communicate()

print(stdout)

regex = compile(b'('CO.*)')

m = regex.match(stdout)
if m != None:
    print(m)
else:
    print("Doesn't match")

我得到了输出:

b'COMPUTER\r\n'
<_sre.SRE_Match object; span=(0, 15), match=b'COMPUTER\r'>

我知道,在这种情况下我可以使用更简单(但出于某种原因我不想使用它):

socket.gethostname()

问题是,我不喜欢正则表达式匹配的整个输出:

<_sre.SRE_Match object; span=(0, 15), match=b'COMPUTER\r'>

我不仅要COMPUTER

这可能吗,不使用另一个正则表达式?

【问题讨论】:

  • 你试过m.group(1).decode("ascii")吗?
  • 太棒了!请把它作为一个。回答。

标签: python regex python-3.5


【解决方案1】:

当您打印m 时,您将获得sre 对象的表示(用于调试目的)

要克服小问题,您可以执行以下操作:

m.group(1).decode("ascii").rstrip()
  • 从正则表达式中提取组
  • 解码为str(去掉b前缀)
  • 并从 subprocess 输出中去除 CR+LF 尾随字符

【讨论】:

    【解决方案2】:

    这应该会为您提供字节字符串:m.group(1)。但是对于这个问题,不要使用正则表达式,它是矫枉过正的。相反,请使用if stdout.startswith(b'CO'):

    您的正则表达式包含 Python 语法错误,您不需要编译正则表达式(re.match(b'(CO.*)', stdout) 会这样做)。为什么不使用socket.gethostbyname()?你在真实代码中做的不是hostname吗?

    【讨论】:

    • 是的,hostname 仅用于此示例,我将不得不使用正则表达式,因为我会为命令数量寻找一些变量,而不仅仅是系统。但我喜欢`.startswith()。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-16
    • 2011-08-31
    • 2023-03-13
    • 1970-01-01
    相关资源
    最近更新 更多