在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中用单个空格替换多个空格[重复]的主要内容,如果未能解决你的问题,请参考以下文章
删除Javascript中的所有多个空格并替换为单个空格[重复]