2016-05-11 16 views
1

指定された文字列が正確に2回繰り返されるかどうかを確認しようとしています。以下は、私が使用している正規表現です:任意の文字に一致する正規表現は、正確に2回繰り返されます

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

ただし、以下の文字列に対して試験したとき、私が使用しているものの、以下の(パターンにマッチしている両方の文字列(\ 1):?!

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

ない私が一人でPythonの正規表現は、あなたのニーズを満たしていないだろうと思われる上記のパターン

+4

それはあなたがそれについて考えることができます場合は...後者の例では、パターンが文字列の 'eef'部分に一致しています – donkopotamus

+0

入力が' acedeefg'の場合、期待される出力は何ですか? –

+0

ありがとう@donkopotamus。私は同意する、それはエフ部分に一致しています。私はabcdeefgと一致するようにしたいと思います。 –

答えて

1

で間違っているものを確認してください。文字が正確に2回繰り返すことを確実にするために、アサーションの背後にある負の外観を必要とします、そのようなアサーションにはgを含めることはできませんルック参照。

最も簡単な方法は、すべての繰り返しを探し、単にその長さを確認することです。その後

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'] 
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,} n個の文字の3最大の分を有する全繰り返し文字と一致。

  • | OR

  • ([a-z])\2一致するすべての同じ連続文字が最初のパターンにマッチしているので、正確に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 
>>> 

あなたはここに他のanswereのような出力を取得したい場合は、あなたが行く、

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

これはいいです。 1つのしわは、 'a 'が正確に2回繰り返されているにもかかわらず、' guess(' aaabaa ') 'は現在' False'を返すということです。 – donkopotamus

+0

ありがとうございました。両方の答えが働いています –

+0

@donkopotamusは可能なすべてのオプションを追加しました。 –

関連する問題