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

标签 python scrapy whitespace

问题的答案在 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/

相关文章:

python - 创建多人二十一点游戏

html - 我无法在不出现错误的情况下插入基本的 HTML 空格。还有别的办法吗?

python - 如何在scrapy中添加下载视频的进度条?

python - 在 Linux 服务器上使用 Selenium 运行 Scrapy Web Crawler

css - 为什么 `white-space-collapsing` CSS3 属性的引入被推迟到 CSS-text-4(可能是 `text-space-collapse` )?

unix - 在Unix中用一个逗号替换多个连续的空格

python - 检测 matplotlib 刻度标签何时重叠

python - 如何将一列中最后一次更改的索引分配给每一行?

python - django id 整数限制

python - Scrapy:为什么我的响应对象没有 body_as_unicode 方法?