Skip to main content
 首页 » 编程设计

python之在 Python 中删除前导/结尾和内部多个空格但不删除制表符、换行符或返回字符

2025年05月04日18lori

问题的答案在 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")])