我有这个字符串:
mystring = 'Here is some text I wrote '
我如何用一个空格替换双,三重(…)空白字符,以便我得到:
mystring = 'Here is some text I wrote'
正则表达式可用于对组合的空白字符提供更多的控制。
要匹配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:
\s
为Unicode (str)模式: 匹配Unicode空白字符(包括[\t\n\r\f\v],以及许多其他字符,例如 在许多语言中,排版规则要求使用不间断空格)。 如果使用ASCII标志,则只匹配[\t\n\r\f\v]
关于re.ASCII:
re.ASCII
使\w, \w, \b, \b, \d, \d, \s和\s只执行ascii匹配,而不是完全的Unicode匹配。这只对Unicode有意义 模式,对于字节模式则被忽略。对应于内联 标志(?). < / p >
strip()将远程控制任何前导和后面的空白。
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快)。
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]
刚刚遇到这篇文章,它提供了这些方法的速度比较。