2017-03-03 4 views
0

反復パターンについての一つの質問回文パターン

私が持っている:のは、私が最初に持っているものは何でも唯一のリストから121または535または737を取得したいとしましょう今

import re 

a = ['123', '121', '136'] 
pattern_variable = '[1-9][1-9][1-9]' 

for i in a: 
    match = re.match(pattern_variable,i) 
    if match != None: 
     print(i) 

と3番目の位置は同じです。どのように私はパターン変数でこれを定義すると思いますか?

+0

'([1-9])[1-9] \ 1' – depperm

答えて

2

あなたはキャプチャグループとbackreferenceを使用することができますありがとう:あなたは、それは文字列全体です確認するには

r'([1-9])[1-9]\1' 

r'\A([1-9])[1-9]\1\Z' 

または3桁その

1つの単一の番号を構成:

r'\b([1-9])[1-9]\1\b' 

最後の2つの正規表現は、4121121と一致しないようにします。

更新

あなたが121なく111を一致させたい場合は、あなたがnegative lookaheadを使用することができます。

import re 

a = ['123', '121', '136', '1232', '111', '1a1'] 
pattern_variable = r'\b([1-9])(?!\1)[1-9]\1\b' 

for i in a: 
    match = re.match(pattern_variable,i) 
    if match != None: 
     print(i) 

#=> 121 

それは意味:単語の境界、自身が続いていない数字、別の数字、最初のものと同じ桁と単語境界:)

+0

こんにちは、ありがとうございます。私はちょうどもう一つのことを聞いてもいいですかあなたは121とパターンマッチしますが、同様に111にマッチします。どのように私は最初のポジション1と3の1番目に何かに何かを一致させることができますが、何も1秒以上?ありがとう –

+0

@Testingmanが更新されました。それは楽しいものでした。 –

+0

ありがとう、エリック、非常に興味深い。それは有り難いです。 –

2

逆参照を使用します。

pattern_variable = r'([1-9])[1-9]\1' 

生の文字列リテラルを使用する必要があること、または1を2回エスケープする必要があることに注意してください。あなたは全体文字列を一致させたい場合は

はまた、あなたはre.match()は文字列のみの開始で試合を固定するため、パターンの最後に$を追加する必要があります。また、Python 3.4以降を使用している場合は、re.fullmatch()メソッドでpattern_variable正規表現を使用することもできます。