Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何使用正则表达式反向引用查找重复两次或三次的单词?_Python_Regex_Python 3.x - Fatal编程技术网

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

Python 如何使用正则表达式反向引用查找重复两次或三次的单词?,python,regex,python-3.x,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)) 我犯了一个错误 反斜杠后面的数字表示您指的是哪个捕获组,而不是它应该出现多少次。使用{n}重复前面的选择器n次 适当的解决办法是: 在这里,我使用(?:…)创建一个非捕获组(即无法引用的

我正在学习正则表达式,我试着找到重复两次的猫,我找到了

import re
f = "cat bat rat cat cat cat"
print(re.findall(r'(cat) \1',f))
但是当我想检查这个词是否重复了两次并使用

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

我犯了一个错误

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

适当的解决办法是:

在这里,我使用
(?:…)
创建一个非捕获组(即无法引用的组),以便将空格和后引用分组在一起。这样我就得到了一个选择器,它可以同时选择它们,并且可以用
{n}

根据您的文本输入,您可能希望将空格替换为
\s
(即任何空格)和/或附加
+
,以匹配多个空格或制表符分隔单词的情况

使用单词边界
\b
也可能有用,例如: 因此,您不会匹配
“山猫”
“猫”

\b(?:(cat)\s??\b){3}
简言之:

寻找一个单词边界,它是三次,后跟: 字符序列“cat”,后面跟着一个可选的空白(如果可能的话)和一个必要的字边界。 在比赛中捕捉“猫”


Python实现:


如果这三只猫出现,而不是多久出现一次,则只针对问题使用搜索。

简短回答:
\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

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']