2011-11-09 37 views
2

我有一個規則的experssion,應該找到一行中最多10個單詞。這是,它應該包括在換行之前的單詞,但不包括換行之後的單詞。我對「\ n」使用負面後視。Python,正則表達式負反向行爲

a = re.compile(r"((\w)+[\s /]){0,10}(?<!\n)") 
r = a.search("THe car is parked in the garage\nBut the sun is shining hot.") 

當我執行此正則表達式並調用該方法r.group(),我找回了整個句子,但包含句的最後一個字。我期待的只是新行之前的完整字符串。也就是說,「車子停在車庫裏\ n」。 我在這裏以負面的背景做出了什麼錯誤...?

+0

你可以編輯你的問題,包括更多的例子嗎?下面的討論讓我很困惑,關於你想要達到的目標。 – N3dst4

回答

0

我不知道爲什麼你會使用負向視向。你是說在換行之前你最多需要10個字。下面的正則表達式應該可以工作。它使用積極的lookahead來確保之後的換行字。當搜索單詞時,使用`b \ w + \ b`而不是你正在使用的。

/(\b\w+\b)*(?=.*\\n)/ 

的Python:

result = re.findall(r"(\b\w+\b)*(?=.*\\n)", subject) 

說明:

# (\b\w+\b)*(?=.*\\n) 
# 
# Match the regular expression below and capture its match into backreference number 1 «(\b\w+\b)*» 
# Between zero and unlimited times, as many times as possible, giving back as needed (greedy) «*» 
# Note: You repeated the capturing group itself. The group will capture only the last iteration. Put a capturing group around the repeated group to capture all iterations. «*» 
# Assert position at a word boundary «\b» 
# Match a single character that is a 「word character」 (letters, digits, etc.) «\w+» 
#  Between one and unlimited times, as many times as possible, giving back as needed (greedy) «+» 
# Assert position at a word boundary «\b» 
# Assert that the regex below can be matched, starting at this position (positive lookahead) «(?=.*\\n)» 
# Match any single character that is not a line break character «.*» 
#  Between zero and unlimited times, as many times as possible, giving back as needed (greedy) «*» 
# Match the character 「\」 literally «\\» 
# Match the character 「n」 literally «n» 

您也不妨考慮一個事實,即有可能是你的字符串中沒有\ n。

+0

其實我想從行首找到最多十個單詞。問題是,在某些情況下,我可能會有更少的單詞,並且在最後一個單詞後面有一個換行符(\ n)(例如... hot \ n)。在這種情況下,我還想包括最後一個字。 – user963386

+0

@ user963386我很困惑。你能不能請示例輸入和輸出,以便你可以讓你的問題更清楚? – FailedDev

+0

例子1:「我在開車\ n明天太陽很熱\ n我會釣魚」在這種情況下,我想找到「明天太陽很熱」 – user963386

0

對於此任務,有錨點$可以找到字符串的末尾,並與修改器re.MULTILINE/re.M一起找到該行的結尾。所以,你最終會得到這樣的事情

(\b\w+\b[.\s /]{0,2}){0,10}$ 

看到它here on Regexr

\b是一個字邊界。在我的示例中,我包含[.\s /]{0,2}以匹配一個點,後跟一個空格。如果你不想要這些零件,至少可以選擇這個零件,如[\s /]?,否則它將在最後一個單詞上丟失,然後\s\n匹配。

更新/ 2思想

好吧,也許我誤解了我的第一個解決你的問題。

如果你只是想不匹配一個換行符並繼續在第二行,那麼就不要允許它。問題在於你的角色類中的換行符是\s。該\s是空白的類,這也包括換行符\r\n

你已經在類中的空間,然後只是\t更換\s中要允許標籤的情況下,然後你應該不罰款向後看。當然,使字符類可選,否則最後一個字也不會匹配。

((\w)+[\t /]?){0,10} 

看到它here on Regexr

+0

這不是總是會返回輸入中的* last * 10個單詞? – N3dst4

+0

@ N3dst4與多行修飾符一起會返回換行前的最後10個單詞 – stema

+0

@ N3dst4也許我錯了,我更新了我的答案 – stema

0

如果我讀了你的權利,你想讀的最多10個字,還是先換行,以先到者爲準:

((?:(?<!\n)\w+\b[\s.]*){0,10}) 

它使用負回顧後,但只是之前的這個詞匹配,所以它阻止了之後換行。

這將需要對不完善的輸入進行一些調整,但這是一個開始。

0

我認爲你不應該使用任何後視。如果你想匹配多達十個字不包括換行,試試這個:

\S+(?:[ \t]+\S+){0,9} 

一個字在這裏被定義爲一個或多個非空白字符,其中包括時間,省略號和其他句子標點符號以及作爲信件。如果你知道你正在匹配的文本是正規的散文,那麼將自己限制爲\w+並不意味着無論如何都不會匹配自然語言的單詞。

第一個單詞之後,它會重複匹配一個或多個水平空格字符(空格或TAB),後跟另一個單詞,最多10個單詞。如果它在第十個單詞之前遇到換行符,就會停止匹配。沒有必要在正則表達式中提及換行符。