6

我想使用正则表达式查找具有连续字母对的单词。我知道只有一对像zoo (oo)、puzzle (zz)、arrange (rr)这样的连续对,它可以通过'(\w){2}'. 但是怎么样

  • 连续两对: 委员会(ttee)
  • 连续三对: 簿记员(ookkee)

编辑:

  • '(\w){2}'实际上是错误的,它会找到任意两个字母而不是双字母对。
  • 我的目的是找到有字母对的单词,而不是对。
  • “连续”是指字母对之间没有其他字母。
4

4 回答 4

15

使用重新查找器

>>> [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}
于 2013-07-10T00:54:08.037 回答
6

您可以使用此模式:

[a-z]*([a-z])\1([a-z])\2[a-z]*

这个想法是使用反向引用\1并引用\2捕获组。

请注意,(\w){2}匹配两个单词字符但不是相同的字符。

于 2013-07-10T00:48:54.537 回答
1

为了检测2 个或多个连续字母,正则表达式变为:(\w)\1+

于 2014-07-23T11:08:02.440 回答
0

因为您提到要从列表中进行测试,所以我已经这样回答了。使用 falsetru 的答案:

newlist = []

for word in list:
  if [m.group() for m in re.finditer(r'((\w)\2)+', word)] != []:
     newlist.append(word)

print newlist
于 2013-07-10T04:27:04.037 回答