我正在学习正则表达式,我尝试找到重复两次的猫,我发现了它。
import re
f = "cat bat rat cat cat cat"
print(re.findall(r'(cat) \1',f))
但是当我想检查这个词是否重复两次并使用
时print(re.findall(r'(cat) \2',f))
我收到错误。
答案 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;如果匹配。
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