如何使用正则表达式反向引用找到重复两次或三次的单词?

时间:2016-04-17 08:07:28

标签: python regex python-3.x

我正在学习正则表达式,我尝试找到重复两次的猫,我发现了它。

import re
f = "cat bat rat cat cat cat"
print(re.findall(r'(cat) \1',f))

但是当我想检查这个词是否重复两次并使用

print(re.findall(r'(cat) \2',f))

我收到错误。

3 个答案:

答案 0 :(得分:1)

反斜杠后面的数字表示您指的是哪个捕获组,而不是它应该发生的次数。使用{n}重复上一个选择器n次。

正确的解决方案是:r'(cat)(?: \1){2}'

这里我用(?: ... )创建一个非捕获组(即一个无法引用的组),因此空间和后引用被组合在一起。通过这种方式,我得到一个选择器,可以选择它们,并可以{n}重复 根据您的文本输入,您可能希望用\s(即任何空格)替换空格和/或附加+以匹配多个空格或制表符分隔单词的情况。

使用单词边界\b可能也很有用: r'\b(cat)(?: \1){2}\b',因此您无法与'bobcat cat cat''cat cat cats'

匹配

答案 1 :(得分:0)

\b(?:(cat)\s??\b){3}

用文字:

寻找一个单词边界,这是三次,然后是: 字符序列' cat',其后面是可选的空格(如果可能的话),以及必要的字边界。 捕捉猫#39;如果匹配。

regex101 example

Python实现:

import re
f = "cat bat rat cat cat cat hot dog cat cat cat"
re.findall(r'\b(?:(cat)\s??\b){3}', f)
# result: ['cat', 'cat']

当问题出现时,如果三只猫出现而不是多久就会使用re.search。

答案 2 :(得分:0)

简短回答\b(\w+)\s\1(\s\1)?\b

长期回答

您需要一个重复两次或三次的单词,因此

  • \w+将匹配所有单词
  • 后跟空格\s
  • 但是您希望之前重复精确的单词,因此将已经写好的\w包裹在()中以将其分组-这样它就变成了(\w+)\s
  • 您现在返回引用上面的内容,它变为(\w+)\s\1。在这个阶段,您将所有单词重复两次
  • 对于具有相同单词的可选(?)出现三次,您说\s\1?-这意味着可选地(用?表示)在空格后检查相同单词,因此(可选),再次将其放入(\s\1)?这样的组中
    • 最后,您只希望匹配完整的单词,因此,请在\b之前加上前缀,即用分词符将它们分开

变为\b(\w+)\s\1(\s\1)?\b