检查并删除python中字符串中的特定char

时间:2015-09-06 00:43:28

标签: python string

我遇到的情况是我有一个字符串和一个连续重复的特殊符号,例如:

s = 'a.b.c...d..e.g'

如何检查是否重复并删除连续符号,结果如下:

s = 'a.b.c.d.e.g'

5 个答案:

答案 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__)
        )
    )