2015-04-06 86 views
2

假設我們不需要打擾大寫或小寫,所以我使用了re.IGNORECASE。計算python中txt文件中單詞的出現

我用正則表達式來解決這個問題。這是我解決的方法:

total = 0 
for line in alllines: 
    count = 0 
    count = len(re.findall(word, line, re.IGNORECASE)) 
    total += count 

但是我遇到了一個我想知道的新問題。如果我只想要完整的單詞怎麼辦?例如,如果該行包含'helloworld',那麼如果我的詞語'hello',則不應該計算在內。但我的方式會計算在內。有什麼建議麼?

+0

放字邊界'\ bhello \ b' – 2015-04-06 04:49:51

回答

3

要匹配完整的單詞,您需要使用單詞邊界。

​​

但是,這將匹配foo:hello:barhello。如果你不想要這種類型的匹配,那麼你可以使用lookaround斷言來匹配一個完整的單詞。

count = len(re.findall(r'(?<!\S)'+ word + r'(?!\S)', line, re.IGNORECASE)) 

如果word你是喜歡在正則表達式來傳遞包含特殊車型字符,那麼你需要使用它的正則表達式中之前這個詞應用re.escape功能。

count = len(re.findall(r'(?<!\S)'+ re.escape(word) + r'(?!\S)', line, re.IGNORECASE)) 

(?<!\S)稱爲它斷言的匹配不會由非空格字符preceeded負回顧後發。爲什麼我們在這裏使用斷言意味着,它不會匹配任何字符,而是斷言匹配是否可能。 (?!\S)稱爲否定預測,它聲稱匹配不會跟隨非空格字符。即除了非空格字符以外的任何東西。

+0

謝謝。我學習新知識,今天^^ – 2015-04-06 04:57:55

+0

我有一個字符串 海峽=「‘RT @ 5SOS’:‘[email protected] @add_df’」。 我寫的正則表達式匹配@ ... 匹配= R '@ \ W +' 計數= re.findall(匹配 ' 「RT @ 5SOS」: 「[email protected] @add_df」',re.IGNORECASE) 打印(計數) 的輸出是如下: ['@ 5SOS','@gmail','@add_df'] 但我只想要那些@ ..之前有一個空格。所以預期的輸出是這樣的: ['@ 5SOS','@add_df'] 我試過匹配= r \ s'@ \ w +'但答案與預期的結果大不相同,因爲它會像這個。 ['@ 5SOS','@add_df'] 有何建議? – 2015-04-06 05:45:04

+0

將'\ s'放在正面lookbehind裏面,如'r'(?<= \ s)@ \ w +''或使用捕獲組'r'\ s(@ \ w +)'' – 2015-04-06 05:47:02