Python的string.whitespace很棒:
>>> string.whitespace
'\t\n\x0b\x0c\r '
如何使用字符串而无需手动输入'\ t | \ n | ...等正则表达式?
例如,它应该能够转: “请不要伤害我。”
到
“请不要伤害我。”
我可能想要保留单个空格,但是我觉得很容易就去string.whitespace [: - 1]。
答案 0 :(得分:143)
这个用例确实有一个特例快捷方式!
如果你在没有参数的情况下调用str.split
,它会在空格而不是单个字符的运行时分割。所以:
>>> ' '.join("Please \n don't \t hurt \x0b me.".split())
"Please don't hurt me."
答案 1 :(得分:13)
\s
字符类有什么问题?
>>> import re
>>> pattern = re.compile(r'\s+')
>>> re.sub(pattern, ' ', "Please \n don't \t hurt \x0b me.")
"Please don't hurt me."
答案 2 :(得分:9)
让我们做一些合理的假设:
(1)你真的想用一个空格(一个长度为1或更长的行)替换任何空格字符的运行。
(2)您希望使用unicode对象在Python 2.X下使用相同的代码进行最小的更改。
(3)您不希望您的代码承担文档中无法保证的内容
(4)您希望使用相同的代码处理Python 3.X str对象的最小更改。
当前选择的答案存在以下问题:
(a)将" " * 3
更改为" " * 2
,即删除重复的空格,但不删除一式三份,一式四份等空格。 [失败要求1]
(b)将"foo\tbar\tzot"
更改为"foobarzot"
[未满足要求1]
(c)当输入unicode对象时,得到TypeError: translate() takes exactly one argument (2 given)
[失败要求2]
(d)使用string.whitespace[:-1]
[未通过要求3; string.whitespace中的字符顺序不保证]
(e)使用string.whitespace[:-1]
[未通过要求4;在Python 2.X中,string.whitespace是'\t\n\x0b\x0c\r '
;在Python 3.X中,它是'\ t \ n \ r \ x0b \ x0c']
" ".join(s.split())
答案和re.sub(r"\s+", " ", s)
答案没有这些问题。
答案 3 :(得分:2)
您可以使用翻译方法
import string
s = "Please \n don't \t hurt \x0b me."
s = s.translate(None, string.whitespace[:-1]) # python 2.6 and up
s = s.translate(string.maketrans('',''), string.whitespace[:-1]) # python 2.5, dunno further down
>>> s
"Please don't hurt me."
然后删除重复的空格
s.replace(' ', ' ')
>>> s
"Please don't hurt me."
答案 4 :(得分:1)
一个起点..(虽然它不比手动组装空白马戏团短)..
>>> from string import whitespace as ws
>>> import re
>>> p = re.compile('(%s)' % ('|'.join([c for c in ws])))
>>> s = "Please \n don't \t hurt \x0b me."
>>> p.sub('', s)
"Pleasedon'thurtme."
或者如果你想将空格减少到最多一个:
>>> p1 = re.compile('(%s)' % ('|'.join([c for c in ws if not c == ' '])))
>>> p2 = re.compile(' +')
>>> s = "Please \n don't \t hurt \x0b me."
>>> p2.sub(' ', p1.sub('', s))
"Please don't hurt me."
第三种方式,更紧凑:
>>> import string
>>> s = "Please \n don't \t hurt \x0b me."
>>> s.translate(None, string.whitespace[])
"Pleasedon'thurtme."
>>> s.translate(None, string.whitespace[:5])
"Please don't hurt me."
>>> ' '.join(s.translate(None, string.whitespace[:5]).split())
"Please don't hurt me."