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

Python 正则表达式来匹配任何重复两次的字符,python,regex,Python,Regex,我试图确定提供的字符串是否有重复两次的字符。以下是我正在使用的正则表达式: ([a-z])\1(?!\1) 但是,当针对以下字符串进行测试时,下面两个字符串都与模式匹配(尽管我使用了(?!\1): 不确定上述模式中的错误是什么,我怀疑单独使用python正则表达式无法满足您的需要。为了确保一个字符重复两次,将需要一个否定的look-behind断言,并且此类断言不能包含组引用 最简单的方法是寻找所有重复,并简单地检查它们的长度 def double_repeats(txt): impo

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

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


不确定上述模式中的错误是什么,我怀疑单独使用python正则表达式无法满足您的需要。为了确保一个字符重复两次,将需要一个否定的look-behind断言,并且此类断言不能包含组引用

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

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]
然后:


您可以使用regex交替运算符技巧

>>> 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,最大值为n个字符

  • |

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

如果你想像其他人一样获得输出,那就来吧

>>> 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']
>>> 

我觉得这是最好的办法


如果有助于您思考……在后一个示例中,模式匹配字符串的
eef
部分如果输入为
acedeefg
,预期输出是什么?谢谢@donkopotamus。我同意,它匹配eef部分。我希望它只匹配abcdeefg,而不是abcdeefgabcdeeefg@KennethK.怎么做?你不能用back引用,即使你可以,在你需要它的时候,捕获还没有发生,所以
\1
还没有被设置。@PaulL是的,我刚刚发现了。我想我被C惯坏了)这很好。一个问题是,
guess('aaabaa')
当前将返回
False
,尽管
a
恰好重复了两次。谢谢大家的回答。两个答案都有效解决方案似乎检查提供的字符串是否至少有两个字母“a”(或“a”)。它似乎没有回答这个问题。@aaabb先生,我没有做他的家庭作业,我只是想给他指路。我希望您知道如何将“a”转换为“[a-z]”
>>> 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]
>>> 
>>> 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']
>>>