我有这个字符串:
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'
当前回答
一个简单的可能性(如果您宁愿避免REs)是
' '.join(mystring.split())
拆分和连接执行您明确要求的任务——此外,它们还执行您没有讨论但在示例中可以看到的额外任务,即删除尾随空格;-)。
其他回答
正则表达式可用于对组合的空白字符提供更多的控制。
要匹配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有意义 模式,对于字节模式则被忽略。对应于内联 国旗(?)。
Strip()将远程控制任何前导和尾随空格。
一个简单的可能性(如果您宁愿避免REs)是
' '.join(mystring.split())
拆分和连接执行您明确要求的任务——此外,它们还执行您没有讨论但在示例中可以看到的额外任务,即删除尾随空格;-)。
为了完整起见,您还可以使用:
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的分割/连接解决方案的执行速度至少一样快(通常要快得多)。
在你的例子中,使用默认值time . 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]
编辑:
刚刚看到这篇文章,它提供了一个相当长的比较这些方法的速度。