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