【问题标题】:re.search not matching the byte stringre.search 与字节字符串不匹配
【发布时间】:2017-11-22 21:21:16
【问题描述】:

我有一个从 pexpect 的 session.before 得到的字符串对象。

从此我正在尝试re.search 使用以下正则表达式获取设备ID。但它不匹配。

print (str(sess.before))
b'\r\n* daemon not running. starting it now on port 5037 *\r\n* daemon started successfully *\r\n353651\tdevice\r\n\r\n\r\n'

device_id = re.search ('([0-9a-zA-Z]+)[\t ]+device', str(sess.before))
print (device_id)
None

【问题讨论】:

  • @Wiktor:有点。问题主要在于str() 调用是将bytes 对象转换为字符串的一种非常错误的方法。
  • @MartijnPieters:我只是想知道为什么 OP 有b'\r\n*...' 而不是"b'\\r\\n*...'"?如果您确定至少有 2 个问题,那么是的,可以重新打开它。
  • @WiktorStribiżew:print() 电话掩盖了这个问题;实际上print(bytesobject) 已经在使用str(),所以第一行中的str() 是完全多余的。 str(sess.before) 确实返回"b'\\r\\n*...'",但是当你打印...
  • @MartijnPieters 我明白这一点,但这仍然意味着如果 str() 两次应用于字节对象,OP 应该写 "b'\\r\\n*...'"。 Ashwin,如果您只需要在正则表达式中添加 b 前缀来解决问题,或者您还必须修改将输入传递给正则表达式的方式,请告知。
  • @WiktorStribiżew: str() 应用于str() 不会使用repr(),它只是返回未更改的字符串。不要在这里落入repr() 的反向陷阱。

标签: python regex python-3.x pexpect


【解决方案1】:

str() 调用将您的bytes 对象转换为表示。选项卡将表示为字符序列'\''t',而不是实际的选项卡:

>>> str(b'\t')
"b'\\t'"

不要把你的字节串敲成这样的字符串。从字节解码到字符串,或者只使用bytes正则表达式:

device_id = re.search(b'([0-9a-zA-Z]+)[\t ]+device', sess.before)

现在device_id 是匹配对象;你可能想打电话给.group(1)

>>> import re
>>> before = b'\r\n* daemon not running. starting it now on port 5037 *\r\n* daemon started successfully *\r\n353651\tdevice\r\n\r\n\r\n'
>>> re.search(b'([0-9a-zA-Z]+)[\t ]+device', before)
<_sre.SRE_Match object; span=(89, 102), match=b'353651\tdevice'>
>>> re.search(b'([0-9a-zA-Z]+)[\t ]+device', before).group(1)
b'353651'

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-06
    • 1970-01-01
    相关资源
    最近更新 更多