2017-03-03 30 views
0

關於重複模式的一個問題迴文圖案從字符串列表中匹配

我:

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) 

現在讓我們假設我想從列表中只有121或535或737的任何具有第一和第三位一樣。你有什麼想法,我將如何定義這與模式變量?

謝謝

+0

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

回答

2

您可以使用捕獲組和backreference

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

如果你想確保它的整個字符串:

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

或者說,3位形成一個單一的號碼:

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

最後2個regexen會阻止4121匹配121

更新

如果你想匹配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。我怎麼能匹配anythin在第一個位置1和第一個1,但第二個在1以外的任何東西?謝謝 –

+0

@Testingman更新。那真的很有趣。 –

+0

謝謝Eric,很有意思。我很感激。 –

2

使用反向引用:

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

請注意,您需要使用原始字符串文字,否則您必須兩次跳過1

此外,如果你想將整個字符串匹配,則需要在模式的末尾添加$因爲re.match()只錨比賽在字符串的開始。或者,如果您使用Python 3.4及更新版本,則可以使用pattern_variable正則表達式與re.fullmatch()方法。