2011-10-22 34 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字邊界錨。

相關問題