在Python中用单个空格替换多个空格[重复]

Posted

技术标签:

【中文标题】在Python中用单个空格替换多个空格[重复]【英文标题】:Substitute multiple whitespace with single whitespace in Python [duplicate] 【发布时间】:2011-01-05 21:08:03 【问题描述】:

我有这个字符串:

mystring = 'Here is  some   text   I      wrote   '

如何将双、三 (...) 空白字符替换为单个空格,以便得到:

mystring = 'Here is some text I wrote'

【问题讨论】:

您可能应该说“用单个 空格 替换多个空格”,因为空格是一类字符(制表符、换行符等) 【参考方案1】:

正则表达式可用于对组合的空白字符提供更多控制。

匹配 unicode 空格:

import re

_RE_COMBINE_WHITESPACE = re.compile(r"\s+")

my_str = _RE_COMBINE_WHITESPACE.sub(" ", my_str).strip()

仅匹配 ASCII 空格:

import re

_RE_COMBINE_WHITESPACE = re.compile(r"(?a:\s+)")
_RE_STRIP_WHITESPACE = re.compile(r"(?a:^\s+|\s+$)")

my_str = _RE_COMBINE_WHITESPACE.sub(" ", my_str)
my_str = _RE_STRIP_WHITESPACE.sub("", my_str)

有时只匹配 ASCII 空格对于保留控制字符(例如 x0b、x0c、x1c、x1d、x1e、x1f)至关重要。

参考:

关于\s

对于 Unicode (str) 模式: 匹配 Unicode 空白字符(包括 [ \t\n\r\f\v],以及许多其他字符,例如 许多语言的排版规则规定的不间断空格)。 如果使用 ASCII 标志,则仅匹配 [ \t\n\r\f\v]。

关于re.ASCII

使 \w、\W、\b、\B、\d、\D、\s 和 \S 只执行 ASCII 匹配,而不是完整的 Unicode 匹配。这仅对 Unicode 有意义 模式,并且对于字节模式被忽略。对应内联 标志 (?a)。

strip() 将远程所有前导和尾随空格。

【讨论】:

如果你真的只想替换空格(''),使用re.sub(' +', ' ', mystring).strip()【参考方案2】:

一个简单的可能性(如果您宁愿避免使用 RE)是

' '.join(mystring.split())

拆分和连接执行您明确询问的任务——此外,它们还执行您未提及但在您的示例中看到的额外任务,即删除尾随空格;-)。

【讨论】:

哦酷,我在摸索类似的解决方案,但使用 split(' ') 然后使用过滤器来删除空元素。我从来不知道没有争论的分裂是这样的。这也快得多,timeit.py 给了我大约 0.74 微秒,而正则表达式给了我 5.75 微秒。 @Roman,是的,x.split()(和 x.split(None))在 空格序列(包括制表符、换行符等,如 re 的 \s)上分割1+ - 它确实非常快。所以,总是很乐意提供帮助! 这是一个非常优雅的解决方案,但我想提一下,这也会删除任何换行符 @trudolf,当然,因为换行符空格——'\n'.isspace()True——所以任何没有的代码replace 会违反as ask 的问题(问题的未表达的intent 当然可能与它的非常明确的表达不同,但是,读心术并不是很普遍技能:-)。 为了避免 '\n' 与 ' ' 混合,可以像这样使用 splitlines() :' '.join((''.join(text.splitlines())).split( ))【参考方案3】:

为了完整起见,您还可以使用:

mystring = mystring.strip()  # the while loop will leave a trailing space, 
                  # so the trailing whitespace must be dealt with
                  # before or after the while loop
while '  ' in mystring:
    mystring = mystring.replace('  ', ' ')

这将在具有相对较少空格的字符串上快速工作(在这些情况下比re 更快)。

在任何情况下,Alex Martelli's split/join solution 的执行速度至少一样快(通常要快得多)。

在您的示例中,使用 timeit.Timer.repeat() 的默认值,我得到以下时间:

str.replace: [1.4317800167340238, 1.4174888149192384, 1.4163512401715934]
re.sub:      [3.741931446594549,  3.8389395858970374, 3.973777672860706]
split/join:  [0.6530919432498195, 0.6252146571700905, 0.6346594329726258]

编辑:

刚刚遇到this post,它对这些方法的速度进行了相当长的比较。

【讨论】:

比其他行更多,因此更少“pythonic”,但更清晰。 提醒一下,如果你打错了,这个有无限循环的风险。

以上是关于在Python中用单个空格替换多个空格[重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何在 PHP 中用单个空格正确替换多个空格?

用单个空格替换字符串中的多间距 - Python [重复]

删除Javascript中的所有多个空格并替换为单个空格[重复]

正则表达式或用单个空格替换多个空格的方法

正则表达式 Python - 用单个空格替换换行符、制表符、空格的任意组合[重复]

用单个空格替换任意数量的空格[重复]