我想找到使用正则表达式连续字母对的单词。 我知道像动物园(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'。 –