无法从字符串中删除“\r\n”

Can't delete "\r\n" from a string

我有这样的字符串:

la lala 135 1039 921\r\n

而且我无法删除 \r\n

最初这个字符串是一个字节对象,但后来我把它转换成了字符串

我尝试了 .strip("\r\n").replace("\r\n", "") 但没有...

>>> my_string = "la lala 135 1039 921\r\n"
>>> my_string.rstrip()
'la lala 135 1039 921'

仅切掉末尾的替代解决方案,它更适合 bytes->string 情况:

>>> my_string = b"la lala 135 1039 921\r\n"
>>> my_string = my_string.decode("utf-8")
>>> my_string = my_string[0:-2]
>>> my_string
'la lala 135 1039 921'

或者地狱,即使是正则表达式解决方案,效果更好:

re.sub(r'\r\n', '', my_string)

问题是字符串包含一个文字反斜杠后跟一个字符。通常,当写入诸如 .strip("\r\n") 的字符串时,这些被解释为转义序列,其中 "\r" 表示回车符 return (ASCII table 中的 0x0D)和 "\n" 表示换行 (0x0A).

因为 Python 将反斜杠解释为转义序列的开头,所以您需要在它后面跟另一个反斜杠来表示您指的是文字反斜杠。因此,调用需要 .strip("\r\n").replace("\r\n", "").

注意:你真的不想在这里使用 .strip() 因为它影响的不仅仅是字符串的结尾,因为它会从中删除反斜杠和字母“r”和“n”字符串。 .replace() 在这里要好一些,因为它会匹配整个字符串并替换它,但它也会匹配字符串中间的 \r\n,而不仅仅是末尾。删除序列的最直接方法是下面给出的条件。

您可以在 Python 语言参考的词法分析部分的 String and Byte Literals 小节中查看 Python 支持的转义序列列表。

为了它的价值,我不会使用 .strip() 来删除序列。 .strip() 删除字符串中的所有字符(它将字符串视为一个集合,而不是模式匹配)。 .replace() 将是一个更好的选择,或者只是使用切片符号在检测到它存在时从字符串中删除尾随 "\r\n"

if s.endswith("\r\n"):
    s = s[:-4]

您还可以确定字符串的长度,例如 20 个字符,然后将其截断为 18 个字符,而不管最后两个字符,或者在执行此操作之前验证它们是否为字符。有时先比较ascii值有助于伪逻辑:

如果字符串中的最后一个字符是制表符、cr、lf 或?然后将字符串缩短一个。重复直到不再找到与 tab、cr、lef 等匹配的结束字符。

'\r\n' 也是 .splitlines() 的标准行分隔符,因此这也可以工作。

>>> s = "la lala 135 1039 921\r\n"
>>> type(s)
<class 'str'>
>>> t = ''.join(s.splitlines())
>>> t
'la lala 135 1039 921'
>>> type(t)
<class 'str'>