我想找到使用正則表達式連續字母對的單詞。 我知道像動物園(oo),拼圖(zz),排列(rr)只有一個連續對,它可以通過'(\w){2}'
實現。但如何對python:如何通過正則表達式找到連續的字母對?
- 連續兩次對:委員會(ttee)
- 連續三對:會計(ookkee)
編輯:
'(\w){2}'
其實是不對的,它會找到任何兩個字母而不是雙字母對。- 我的意圖是找到具有字母對的單詞,而不是雙。
- '連續',我的意思是在字母對之間沒有其他字母。
我想找到使用正則表達式連續字母對的單詞。 我知道像動物園(oo),拼圖(zz),排列(rr)只有一個連續對,它可以通過'(\w){2}'
實現。但如何對python:如何通過正則表達式找到連續的字母對?
編輯:
'(\w){2}'
其實是不對的,它會找到任何兩個字母而不是雙字母對。您可以使用此模式:
[a-z]*([a-z])\1([a-z])\2[a-z]*
的想法是使用反向引用\1
和\2
是指捕獲組。
請注意,(\w){2}
匹配兩個單詞字符但不是相同的字符。
它的工作原理!因此,爲了找到三個連續字母對的字,正則表達式將是[az] *([az])\ 1([az])\ 2 [az] *([az])\ 3 [az] *'但它不僅發現了**簿記員,而且還發現了綠色**,這打破了「連續」規則。如何避免這種情況? –
@Teacode:三人必須寫:'[a-z] *([a-z])\ 1([a-z])\ 2([a-z])\ 3 [a-z] *' –
You are right!謝謝。對我的錯誤感到羞愧,我是一個正則表達式的初學者。 –
>>> [m.group() for m in re.finditer(r'((\w)\2)+', 'zoo')]
['oo']
>>> [m.group() for m in re.finditer(r'((\w)\2)+', 'arrange')]
['rr']
>>> [m.group() for m in re.finditer(r'((\w)\2)+', 'committee')]
['mm', 'ttee']
>>> [m.group() for m in re.finditer(r'((\w)\2)+', 'bookkeeper')]
['ookkee']
檢查字符串是否包含對連續:
>>> bool(re.search(r'((\w)\2){2}', 'zoo'))
False
>>> bool(re.search(r'((\w)\2){2}', 'arrange'))
False
>>> bool(re.search(r'((\w)\2){2}', 'committee'))
True
>>> bool(re.search(r'((\w)\2){2}', 'bookkeeper'))
True
您還可以使用以下非捕獲(?:
)版本:
(?:(\w)\1){2}
我想我的問題很糟糕。不是從單詞中找到字母對,我真正想要做的就是找到具有連續字母對的單詞(來自單詞列表)。 –
@Teacode,我更新了代碼。 – falsetru
謝謝。現在我懂了。 '((\ w)\ 2){3}'相當於'(\ w)\ 1(\ w)\ 2(\ w)\ 3',更優雅! –
因爲你提到你想從列表中測試,我已經回答爲這樣。使用falsetru的回答是:
newlist = []
for word in list:
if [m.group() for m in re.finditer(r'((\w)\2)+', word)] != []:
newlist.append(word)
print newlist
爲了檢測2或更多的連續字母正則表達式變爲:(\w)\1+
的可能重複的[返回詞語具有雙連續的字母(http://stackoverflow.com/ question/9593622/return-words-with-double-consecutive-letters) – ChrisGuest
'\ w {2}'只指兩個字母,'ab','cc'都可以。 – zhangyangyu
實際上,'(\ w){2}'匹配任何2個連續的字母,匹配與否。它將匹配'動物園'上的'zo'。 –