问题的答案在 Python remove all whitespace in a string显示了在 Python 中分别从字符串中删除前导/结尾、重复和所有空格的不同方法。但是 strip() 删除制表符和换行符,而 lstrip() 只影响前导空格。使用 .join(sentence.split()) 的解决方案似乎也删除了 Unicode 空白字符。
假设我有一个字符串,在本例中是使用 Scrapy 从网站上抓取的,如下所示:
['\n \n ',
'\n ',
'Some text',
' and some more text\n',
' and on another a line some more text', '
']
当我在其他上下文中使用换行符时,换行符会保留文本的格式,但所有额外的空间都很麻烦。 如何在保留换行符的同时删除所有前导、结尾和重复的内部空格(除了任何\r 或\t 字符,如果有的话)?
我想要的结果(在加入各个字符串之后)将是:
['\n\n\nSome text and some more text\nand on another line some more text']
没有提供示例代码,因为到目前为止我所尝试的只是上面引用的页面上的建议,它得到了我试图避免的结果。
最佳答案
在那种情况下 str.strip()
不会帮助你(即使你使用 ""
作为参数,因为它不会删除里面的空格,仅在字符串的开头/结尾,它也会删除 "and"
之前的单个空格。
相反,使用正则表达式从字符串中删除 2 个或更多空格:
l= ['\n \n ',
'\n ',
'Some text',
' and some more text\n',
' and on another a line some more text']
import re
result = "".join([re.sub(" +","",x) for x in l])
print(repr(result))
打印:
'\n\n\nSome text and some more text\n and on another a line some more text'
编辑:如您所述,如果我们将正则表达式应用于每一行,在某些情况下我们无法检测到 \n
。因此,另一种更复杂的解决方案是在应用正则表达式之前加入字符串,并应用更复杂的正则表达式(请注意,我更改了字符串的测试列表以添加更多极端情况):
l= ['\n \n ',
'\n ',
'Some text',
' and some more text \n',
'\n and on another a line some more text ']
import re
result = re.sub("(^ |(?<=\n) | +| (?=\n)| $)","","".join(l))
print(repr(result))
打印:
'\n\n\nSome text and some more text\n\nand on another a line some more text'
现在正则表达式中有 5 个案例将被删除:
- 以一个空格开始
- 换行符后的空格
- 2个或更多空格
- 空格后跟一个换行符
- 以一个空格结束
Aftertought:看起来(实际上)很复杂。毕竟是一个非正则表达式的解决方案,它给出了完全相同的结果(如果单词之间没有多个空格):
result = "\n".join([x.strip(" ") for x in "".join(l).split("\n")])
print(repr(result))
只是连接字符串,然后根据换行符拆分,应用 strip
和 ""
作为参数保留制表符,然后根据换行符再次连接。
与 re.sub("+","",x.strip(""))
链接以处理单词之间可能出现的双空格:
result = "\n".join([re.sub(" +"," ",x.strip(" ")) for x in "".join(l).split("\n")])
关于python - 在 Python 中删除前导/结尾和内部多个空格但不删除制表符、换行符或返回字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44811224/