TypeError:无法在类似字节的对象“ python3.6”上使用字符串模式

时间:2018-08-08 06:22:55

标签: python

我有下面的代码

    for eol in ['\r\n', '\r', '\n']:
        content = re.sub('%s$' % eol, '', content)

内容类型为bytes

内容数据为

b"Trying IP...\r\nConnected to IP.\r\nEscape character is '^]'.\r\n"

内容类型

<class 'bytes'>

我正在读取PEXECT数据,这是内容的来源。它来自telnet终端

我遇到错误了

TypeError: cannot use a string pattern on a bytes-like object

为什么我会收到此错误

2 个答案:

答案 0 :(得分:1)

如果您无法控制内容的数据类型,则可以使用类似的内容。

for eol in [b'\r\n', b'\r', b'\n']:
    content = re.sub(b'%s$' % eol, b'', content)

答案 1 :(得分:1)

pexpect可以给您Unicode字符串,除非您要求它给您字节。

如果您想要给您字节,例如,因为您不知道telnet服务器期望您使用的编码,那很好,但是您必须以字节为单位进行处理。这意味着在re中使用字节模式,而不是字符串模式:

for eol in [b'\r\n', b'\r', b'\n']:
    content = re.sub(b'%s$' % eol, b'', content)

但是,如果您不想要字节,最好将所有内容解码为str,那么您现有的代码就可以正常工作:

content = pexpect.run('ls -l', encoding='utf-8')
for eol in ['\r\n', '\r', '\n']:
    content = re.sub('%s$' % eol, '', content)

作为旁注,如果您只是想删除最后一行的最后一个换行符,则无需正则表达式就可以轻松得多:

content = content.rstrip('\r\n')

或者,如果您尝试做一些不同的事情,例如删除空白行,即使这样写起来也可能更好:

content = '\n'.join(line for line in content.splitlines() if line)

…,但是,这仍然给您带来同样的问题,那就是需要适当地使用b'\n''\n'