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

TypeError:无法在类似对象'python3.6'的字节上使用字符串模式`,python,Python,我有下面的代码 for eol in ['\r\n', '\r', '\n']: content = re.sub('%s$' % eol, '', content) 其中内容类型为字节 内容数据是 b"Trying IP...\r\nConnected to IP.\r\nEscape character is '^]'.\r\n" 内容类型 <class 'bytes'> 为什么会出现此错误如果无法控制内容的数据类型,可以使用类似的方法 for eo

我有下面的代码

    for eol in ['\r\n', '\r', '\n']:
        content = re.sub('%s$' % eol, '', content)
其中内容类型为
字节

内容数据是

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

<class 'bytes'>

为什么会出现此错误

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

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

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

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

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'

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'

想必
内容
字节
或其他类似
字节的对象。既然你没有告诉我们它是什么或者它来自哪里,很难说得更多。可能问题在于您调用了
encode
某个您不应该调用的地方,或者您正在使用
请求
响应并使用
r.content
而不是
r.text
,或者您以二进制模式而不是文本模式打开了一个文件。或者,您只需要使用正确的编码调用
context
上的
decode
。或者它实际上应该是一个
字节
,您只需要使用
字节
模式,所以将所有这些字符串文本更改为字节文本。内容中的数据是什么?你能展示一下吗?好的,那么错误信息告诉你的和我刚才告诉你的完全一样。但如果这还不足以让你理解如何修复它,你需要给我们更多的上下文,
内容
来自哪里,它是什么编码,它应该是一个
字节
,你想用它做什么,等等。-因此,不要给你六个可能与你无关的选项,我们实际上可以给你一个答案。我的第一个想法-内容是类似字节的对象,而不是字符串。我不确定,检查一下。@ZRTSIM OP已经确认它是一个
字节
,甚至编辑成了问题。你为什么要让他检查它?大概
内容
字节
或其他类似
字节的对象。既然你没有告诉我们它是什么或者它来自哪里,很难说得更多。可能问题在于您调用了
encode
某个您不应该调用的地方,或者您正在使用
请求
响应并使用
r.content
而不是
r.text
,或者您以二进制模式而不是文本模式打开了一个文件。或者,您只需要使用正确的编码调用
context
上的
decode
。或者它实际上应该是一个
字节
,您只需要使用
字节
模式,所以将所有这些字符串文本更改为字节文本。内容中的数据是什么?你能展示一下吗?好的,那么错误信息告诉你的和我刚才告诉你的完全一样。但如果这还不足以让你理解如何修复它,你需要给我们更多的上下文,
内容
来自哪里,它是什么编码,它应该是一个
字节
,你想用它做什么,等等。-因此,不要给你六个可能与你无关的选项,我们实际上可以给你一个答案。我的第一个想法-内容是类似字节的对象,而不是字符串。我不确定,检查一下。@ZRTSIM OP已经确认它是一个
字节
,甚至编辑成了问题。你为什么要让他检查?嘿,你能看看我的另一个开放式问题吗:答案被接受,因为你是第一个发表评论的人嘿,你能看看我的另一个开放式问题吗:答案被接受,因为你是第一个发表评论的人