正则表达式匹配任何重复两次的字符

时间:2016-05-11 12:01:19

标签: python regex

我正在尝试确定提供的字符串是否包含重复两次的字符。以下是我正在使用的正则表达式:

([a-z])\1(?!\1)

但是,当针对以下字符串进行测试时,下面的两个字符串都与模式匹配(尽管我使用过(?!\ 1):

>>> re.findall(r'.*([a-z])\1(?!\1)', 'abcdeefg')
['e']
>>> re.findall(r'.*([a-z])\1(?!\1)', 'abcdeeefg')
['e']

不确定上述模式有什么问题

3 个答案:

答案 0 :(得分:1)

我怀疑单独使用python正则表达式无法满足您的需求。为了确保字符重复两次,需要在断言后面进行否定查看,并且此类断言不能包含组引用。

最简单的方法是寻找所有重复,然后检查它们的长度。

def double_repeats(txt):
    import itertools

    # find possible repeats
    candidates = set(re.findall(r'([a-z])\1', txt))

    # now find the actual repeated blocks
    repeats = itertools.chain(*[re.findall(r"({0}{0}+)".format(c), txt) for c in candidates])

    # return just the blocks of length 2
    return [x for x in repeats if len(x) == 2]

然后:

>>> double_repeats("abbbcbbdddeffgggg")
['ff', 'bb']

答案 1 :(得分:0)

您可以使用正则表达式替代操作员技巧。

>>> def guess(s):
    out = re.findall(r'([a-z])\1{2,}|([a-z])\2', s)
    if out and out[0][1]:
        return True
    return False

>>> k = ['abcdeefg', 'abcdeeefg']
>>> [guess(i) for i in k]
[True, False]
>>> 
  • ([a-z])\1{2,}匹配所有重复的字符,其最小为3个字符的最大值。

  • |

  • ([a-z])\2恰好匹配剩余字符串中的两个重复字符,因为所有相同的连续字符都与第一个字符匹配。

>>> def guess(s):
    out = re.findall(r'([a-z])\1{2,}|([a-z])\2', s)
    if out and out[0][1]:
        return out[0][1]
    return False
>>> k =  '23413e4abcee'
>>> k.count(guess(k)) == 2
False
>>> k =  '234134abcee'
>>> k.count(guess(k)) == 2
True
>>>

如果你想获得像其他答案一样的输出,那么你去吧,

>>> def guess(s):
    out = re.findall(r'([a-z])\1{2,}|([a-z])\2', s)
    if out:
        return [y+y for x,y in out if y]
    return []

>>> guess("abbbcbbdddeffgggg")
['bb', 'ff']
>>> 

答案 2 :(得分:-1)

我发现这是最好的方法。

I find it the best way to do that: