我有下面的代码
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
为什么我会收到此错误
答案 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'
。