我有一个字符串:
mystring = 'Here is some text I wrote '
我怎么才能将重复的双倍、三倍(......)空格字符替换为单个空格,以便得到:
mystring = 'Here is some text I wrote'
我有一个字符串:
mystring = 'Here is some text I wrote '
我怎么才能将重复的双倍、三倍(......)空格字符替换为单个空格,以便得到:
mystring = 'Here is some text I wrote'
一个简单的可能性(如果你宁愿避免正则表达式)是:
' '.join(mystring.split())
分割和连接执行你明确要求的任务,而且它们还执行了额外的任务,这个你没有提到但在你的示例中可以看到,即去除尾部空格;-)。x.split()
(和x.split(None)
)会根据长度为1+的空白序列(包括制表符、换行符等,就像re的\s
)进行分割 - 而且速度相当快。很高兴能帮助! - Alex Martelli' '.join(mystring.split(' '))
即可仅删除连续重复的空格。这也将删除前导和尾随空格,但将保留换行符、制表符等。 - FifthAxiom正则表达式可以用于更好地控制组合的空白字符。
要匹配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)
在保留控制字符如x0b、x0c、x1c、x1d、x1e、x1f的情况下,仅匹配ASCII空格有时是必要的。
关于\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-only匹配,而不是完整的Unicode匹配。这仅对Unicode模式有意义,并且对字节模式不起作用。相当于内联标志(?a)。
strip()
将删除任何前导和尾随空格。
re.sub(' +', ' ', mystring).strip()
。 - Simon Hessner为了完整性,你也可以使用:
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 的 split/join 解决方案 至少具有同样快的表现(通常更快)。
在您的示例中,使用 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]
编辑:
刚刚看到这篇文章,它提供了这些方法的速度相对较长的比较。