我如何使用python执行此操作:
如果我有一个格式如下的字符串:
A..a.b.c
使它像:
A.a.b.c
但我事先不知道我有多少个点?
就像linux中的tr -s函数
答案 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'