我遇到的情况是我有一个字符串和一个连续重复的特殊符号,例如:
s = 'a.b.c...d..e.g'
如何检查是否重复并删除连续符号,结果如下:
s = 'a.b.c.d.e.g'
答案 0 :(得分:5)
import re
result = re.sub(r'\.{2,}', '.', 'a.b.c...d..e.g')
更通用的版本:
import re
symbol = '.'
regex_pattern_to_replace = re.escape(symbol)+'{2,}'
# Note that escape sequences are processed in replace_to
# but this time we have no backslash characters in it.
# In case of more complex replacement we could use
# replace_to = replace_to.replace('\\', '\\\\')
# to defend against occasional escape sequences.
replace_to = symbol
result = re.sub(regex_pattern_to_replace, replace_to, 'a.b.c...d..e.g')
与编译的正则表达式相同(在Cristian Ciupitu的评论之后添加):
compiled_regex = re.compile(regex_pattern_to_replace)
# You can store the compiled_regex and reuse it multiple times.
result = compiled_regex.sub(replace_to, 'a.b.c...d..e.g')
查看re.sub
的文档答案 1 :(得分:2)
>>> a = 'a.b.c...d..e.g'
>>> while '..' in a:
a = a.replace('..','.')
>>> a
'a.b.c.d.e.g'
答案 2 :(得分:1)
很多答案,所以为什么不把另一个人扔进去
您可以将字符串自身拉出一个并删除所有匹配的'.'
s:
''.join(x[0] for x in zip(s, s[1:]+' ') if x != ('.', '.'))
当然不是最快的,只是有趣的。把它变成消除所有重复元素是微不足道的:
''.join(a for a,b in zip(s, s[1:]+' ') if a != b)
注意:如果' '
作为填充符导致问题,则可以使用izip_longest
(py2)或zip_longest
(py3)。
答案 3 :(得分:0)
我的previous answer是一个哑巴,所以这是使用reduce()
的另一次尝试。对于O(n)时间复杂度,这是相当有效的:
def remove_consecutive(s, symbol='.'):
def _remover(x, y):
if y == symbol and x[-1:] == y:
return x
else:
return x + y
return reduce(_remover, s, '')
for s in 'abcdefg', '.a.', '..aa..', '..aa...b...c.d.e.f.g.....', '.', '..', '...', '':
print remove_consecutive(s)
<强>输出强>
abcdefg .a. .aa. .aa.b.c.d.e.f.g. . . .
答案 4 :(得分:-1)
有点复杂,但它有效并且它在一个循环中完成:
import itertools
def remove_consecutive(s, c='.'):
return ''.join(
itertools.chain.from_iterable(
c if k else g
for k, g in itertools.groupby(s, c.__eq__)
)
)