2011-10-22 77 views
1

进出口试图使蟒蛇正则表达式,让我一个字符串“N”中找到一个词次正则表达式的字符串中查找单词正好“n”次

例如,如果我想要找到一个可以匹配的表达,如果单词“猫”恰好是两次。我会怎么做?

它应该接受“蓝猫与树中红猫对话”。因为它有两次“猫”。

但它不应该接受“猫很大”。因为它只有一次“猫”

它也不应该接受“狗是黄色的”。出于类似的原因

非常感谢

编辑 嗨

对不起,这个问题太复杂,但我忘了提及的一件事。

如果我想找到“猫”正好有两个时报“的catcat运行”也将匹配

+0

_“正确n”_次,或者_n或更多次? – ridgerunner

回答

3

请不要仅仅因为它们在那里而使用正则表达式。

words = text.split() 
print words.count('cat') 

正如Vincent指出的那样,假定所有单词都被空格分隔。

words = re.findall("\b\w*") 

可能是更好的选择。虽然这是否是必要的取决于您的文章中未提供的详细信息。

编辑

如果你甚至不关心单词边界,甚至有少的原因是使用正则表达式。

print text.count("cat") 
+1

“猫猫”。是您的代码失败时的示例。 –

+0

@Vincent Savard:为什么这会失败?它符合第一篇文章的规格。 – siride

+0

@VincentSavard,是的,你是正确的 –

2

findall + len似乎是一个解决方案。

+0

谢谢。但是有可能用比赛来完成吗?因为我还需要确保某些字词不会出现在字符串中。 – camelCase

2

如何:

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

+0

非常感谢。是否有可能不使用\ b?来做到这一点。 – camelCase

+0

是的,省略'\ b',但是然后“猫”也将作为单词的一部分匹配。 –

+1

你需要添加一个负面的前瞻断言,以确保只有**两只猫。 –

0

只是建立由一组分开的“猫”的多个实例的正则表达式消耗其他字符:

>>> 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> 
+0

不会''*'匹配猫的额外实例吗? –

+0

它当然会。这不是一个好方法。 – davidchambers

0

如果你想使用一个正则表达式,以确保一个字符串中包含的正是两个实例单词“猫”,(不能多不能少,而不是“灾难性”或“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字边界锚。

相关问题