進出口試圖使蟒蛇正則表達式,讓我一個字符串「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