进出口试图使蟒蛇正则表达式,让我一个字符串“N”中找到一个词次正则表达式的字符串中查找单词正好“n”次
例如,如果我想要找到一个可以匹配的表达,如果单词“猫”恰好是两次。我会怎么做?
它应该接受“蓝猫与树中红猫对话”。因为它有两次“猫”。
但它不应该接受“猫很大”。因为它只有一次“猫”
它也不应该接受“狗是黄色的”。出于类似的原因
非常感谢
编辑 嗨
对不起,这个问题太复杂,但我忘了提及的一件事。
如果我想找到“猫”正好有两个时报“的catcat运行”也将匹配
进出口试图使蟒蛇正则表达式,让我一个字符串“N”中找到一个词次正则表达式的字符串中查找单词正好“n”次
例如,如果我想要找到一个可以匹配的表达,如果单词“猫”恰好是两次。我会怎么做?
它应该接受“蓝猫与树中红猫对话”。因为它有两次“猫”。
但它不应该接受“猫很大”。因为它只有一次“猫”
它也不应该接受“狗是黄色的”。出于类似的原因
非常感谢
编辑 嗨
对不起,这个问题太复杂,但我忘了提及的一件事。
如果我想找到“猫”正好有两个时报“的catcat运行”也将匹配
请不要仅仅因为它们在那里而使用正则表达式。
words = text.split()
print words.count('cat')
正如Vincent指出的那样,假定所有单词都被空格分隔。
words = re.findall("\b\w*")
可能是更好的选择。虽然这是否是必要的取决于您的文章中未提供的详细信息。
编辑
如果你甚至不关心单词边界,甚至有少的原因是使用正则表达式。
print text.count("cat")
“猫猫”。是您的代码失败时的示例。 –
@Vincent Savard:为什么这会失败?它符合第一篇文章的规格。 – siride
@VincentSavard,是的,你是正确的 –
如何:
re.match(r'(.*\bcat\b){2}', 'The blue cat talks to the red cat in the tree')
的{2}
的意思是“重复2次。”使用{7}
进行7次重复。 \b
是一个字边界;在这种情况下,“蓝猫会谈”中的猫会匹配,但“验证”不会。 .*
将匹配任何字符串。
您可能想要通过the re
documentation。
非常感谢。是否有可能不使用\ b?来做到这一点。 – camelCase
是的,省略'\ b',但是然后“猫”也将作为单词的一部分匹配。 –
你需要添加一个负面的前瞻断言,以确保只有**两只猫。 –
只是建立由一组分开的“猫”的多个实例的正则表达式消耗其他字符:
>>> import re
>>> n = 2
>>> regex = re.compile('.*'.join(['\bcat\b'] * n))
>>> regex.search('The cat is big')
>>> regex.search('The blue cat talks to the red cat in the tree')
<_sre.SRE_Match object at 0x17ca1a8>
不会''*'匹配猫的额外实例吗? –
它当然会。这不是一个好方法。 – davidchambers
如果你想使用一个正则表达式,以确保一个字符串中包含的正是两个实例单词“猫”,(不能多不能少,而不是“灾难性”或“catcat”),那么下面的测试脚本,将这样的伎俩:
import re
text = r'The cat chased its cat toy, but failed to catch it.'
if re.match(r"""
# Match string containing exactly n=2 "cat" words.
^ # Anchor to start of string.
(?: # Group for specific word count.
(?:(?!\bcat\b).)* # Zero or more non-"cat" chars,
\bcat\b # followed by the word "cat",
){2} # exactly n=2 times.
(?:(?!\bcat\b).)* # Zero or more non-"cat" chars.
\Z # Anchor to end of string.
""", text, re.DOTALL | re.VERBOSE):
# Match attempt successful.
print "Match found"
else:
# Match attempt failed.
print "No match found"
不过,如果你做想匹配这只猫在“灾难性”和“catcat”,然后从正则表达式中删除所有\b
字边界锚。
_“正确n”_次,或者_n或更多次? – ridgerunner