用python挤压字符

时间:2011-10-29 17:48:03

标签: python regex

我如何使用python执行此操作:

如果我有一个格式如下的字符串:

A..a.b.c

使它像:

A.a.b.c

但我事先不知道我有多少个点?

就像linux中的tr -s函数

4 个答案:

答案 0 :(得分:7)

如果您想要一般格式,只用其中一个字符替换任何重复字符序列:

>>> import re
>>> s='aaa,,bb,c'
>>> re.sub(r'(.)(\1+)', r'\1', s)
'a,b,c'

如果您只想限制某些字符:

>>> re.sub(r'([\w])(\1+)', r'\1', s)
'a,,b,c'
>>> re.sub(r'([,])(\1+)', r'\1', s)
'aaa,bb,c'

你的例子:

>>> s='A..a.b.c'
>>> re.sub(r'([.])(\1+)', r'\1', s)
'A.a.b.c'

答案 1 :(得分:5)

Regular expression substitution擅长找到模式(重复点)并替换它们(用一个点):

>>> import re
>>> re.sub(r'\.+', '.', 'A..a.b.c')
'A.a.b.c'

答案 2 :(得分:3)

您希望用一个点替换每次两个或更多点的运行。这是通过以下方式实现的:

>>> import re
>>> re.sub(r'\.\.+', '.', 'A..a.b.c')
'A.a.b.c'

不想也不需要用一个点替换每一轮一个或多个点

>>> re.sub(r'\.+', '.', 'A..a.b.c')
'A.a.b.c'

这会产生相同的结果,但会做出无意义的单点替换(在你的例子中为3),因此会慢得多。

时序:

python -mtimeit -s"import re;subber=re.compile(r'\.+').sub;s=1000*'a.'" "subber('.',s)"
1000 loops, best of 3: 212 usec per loop

python -mtimeit -s"import re;subber=re.compile(r'\.\.+').sub;s=1000*'a.'" "subber('.',s)"
10000 loops, best of 3: 23.2 usec per loop

答案 3 :(得分:2)

如果你真的不必使用正则表达式,这里是一个纯Python版本,只适用于点:

>>> ".".join(filter(bool, "A..a.b.c".split(".")))
'A.a.b.c'