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

3

我有一个这样的字符串:

la lala 135 1039 921\r\n

我无法删除\r\n

最初这个字符串是一个字节对象,但后来我将其转换为了字符串

我尝试使用.strip("\r\n").replace("\r\n", ""),但什么也没发生...


你需要使用.strip() - cs95
1
在你的例子中,\r 是一个反斜杠和字母 r 吗?如果是这样,那么你需要将调用更改为 .strip("\\r\\n").replace("\\r\\n", "") - John Szakmeister
@ChristianDean 看起来是这样!jszakmeister发布的是正确的。 - cs95
@jszakmeister 它可以工作,谢谢!如果您编写答案,我会接受它! - Allexj
你也可以像这样切掉结尾:my_string[0:-5]。或者使用 re.sub(r'\\r\\n', '', mystr) - Cory Madden
5个回答

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

使用仅切片末尾的替代方案,这对于字节->字符串情况更有效:

>>> 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)

仅供参考:my_string[0:-5] 应该是 my_string[0:-4]。实际上,由于其被解释为转义序列,应该是 my_string[0:-2]。否则会修剪过多的内容。 - John Szakmeister
@StefanPochmann 是的,你说得对。我只是为了清晰起见将其打出来,我应该直接从终端复制/粘贴它。 - Cory Madden
好的,现在一切应该都准确了。 - Cory Madden
@jszakmeister 是的,当我执行它时,我看到了那个问题,但今天已经很长了,所以我只是想“哦,是的,也要切掉多余的撇号,然后...” 当然不会有任何冒犯。 - Cory Madden
不用担心,@CoryMadden。希望明天会更好。 :-) - John Szakmeister
显示剩余8条评论

8
问题在于字符串中包含了一个反斜杠后跟一个字符。通常,在写入 .strip("\r\n") 这样的字符串时,这些字符会被解释为转义序列,其中 "\r" 表示回车符(ASCII 表中的 0x0D),而 "\n" 表示换行符(ASCII 表中的 0x0A)。
因为 Python 将反斜杠视为转义序列的开始,所以您需要在其后跟上另一个反斜杠,以表示您意味着字面意义的反斜杠。因此,调用需要是 .strip("\\r\\n").replace("\\r\\n", "")
注意: 在这里使用 .strip() 不是您想要的,因为它影响的不仅仅是字符串的末尾,它会从字符串中移除反斜杠和字母 "r" 和 "n"。在这里使用 .replace() 更好一些,因为它将匹配整个字符串并替换掉它,但它也将在字符串中间匹配 \r\n,而不仅仅是在末尾。最直接的去除该序列的方法是下面给出的条件语句。
您可以在 Python 语言参考的词法分析部分的 字符串和字节文字 子部分中查看 Python 支持的转义序列列表。
就我个人而言,我不会使用 .strip() 来移除该序列。.strip() 会将字符串中的所有字符都删除(它将字符串视为一个集合,而不是模式匹配)。更好的选择是使用 .replace(),或者当检测到其存在时,简单地使用切片表示法从字符串中去除末尾的 "\\r\\n"
if s.endswith("\\r\\n"):
    s = s[:-4]

1
你的strip解决方案很危险,例如 "return\\r\\n".strip("\\r\\n") 变成了 "etu" - Stefan Pochmann
2
它并不是为了解决如何删除字符而存在的,而是为了展示为什么原帖中的解决方案无法工作。但你说得对,.strip() 在这里是不合适的。 - John Szakmeister

2
'

'\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'>

0

你也可以确定字符串的长度,比如说20个字符,然后将其截断为18个字符,而不考虑最后两个字符,或者在执行此操作之前验证它们是否是这两个字符。有时候先比较ASCII值会有所帮助,伪代码如下:

如果字符串中的最后一个字符是制表符、回车符、换行符或问号,则将字符串缩短一个字符。重复此过程,直到找不到与制表符、回车符、换行符等匹配的结束字符为止。


-1
test2 = test.replace('\r\n', "")将会很有趣

楼主已经尝试过了。 - undefined
根据目前的写法,你的回答不够清晰。请编辑以添加更多细节,以帮助他人理解如何解答所提出的问题。你可以在帮助中心找到关于如何撰写好回答的更多信息。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接