簡體   English   中英

Python 正則表達式 A|B|C 匹配 C 即使 B 應該匹配

[英]Python regex A|B|C matches C even though B should match

我已經坐在這個問題上幾個小時了,我真的不知道了......本質上,我有一個 A|B|C - 類型分離的正則表達式,無論出於何種原因,C 匹配 B,即使個人正則表達式應該從左到右進行測試並以非貪婪的方式停止(即一旦找到匹配項,則不再測試其他正則表達式)。

這是我的代碼:

text = 'Patients with end stage heart failure fall into stage D of the ABCD classification of the American College of Cardiology (ACC)/American Heart Association (AHA), and class III–IV of the New York Heart Association (NYHA) functional classification; they are characterised by advanced structural heart disease and pronounced symptoms of heart failure at rest or upon minimal physical exertion, despite maximal medical treatment according to current guidelines.'
expansion = "American Heart Association"
re_exp = re.compile(expansion + "|" + r"(?<=\W)" + expansion + "|"\
                    + expansion.split()[0] + r"[-\s].*?\s*?" + expansion.split()[-1])

m = re_exp.search(text)
print(m.group(0))

我希望正則表達式找到“擴展”字符串。 在我的數據集中,有時文本對擴展字符串進行了略微編輯,例如在主要名詞之間有冠詞或介詞,如“for”或“the”。 這就是為什么我首先嘗試按原樣匹配字符串,然后嘗試匹配它是否在任何非單詞字符之后(即括號,或者像上面的示例一樣,因為空格被省略了很多東西)最后,我只是通過使用通配符搜索字符串的開頭和結尾來查找字符串。

無論哪種方式,對於上面的示例,我希望得到以下 output:

American Heart Association

但我得到的是

American College of Cardiology (ACC)/American Heart Association

這是最終正則表達式的匹配項。

如果我刪除最終的正則表達式或只調用re.findall(r"(?<=\W)"+ expansion, text) ,我會得到我想要的 output ,這意味着正則表達式實際上匹配正確。

是什么賦予了?

所以re.findall(r"(?<=\W)"+ expansion, text)有效,因為在匹配之前是一個非單詞字符(表示為\w ),“/”。 您的正則表達式將匹配“美國 [這里的任何隨機內容] 心臟協會”。 這意味着在匹配內部字符串“American Heart Association”之前,先匹配“American College of Cardiology (ACC)/American Heart Association”。 例如,如果您刪除了字符串中的第一個“American”,您將使用正則表達式獲得您正在尋找的匹配項。

您需要對正則表達式進行更多限制以排除此類情況。

正則表達式如下所示:

American Heart Association|(?<=\W)American Heart Association|American[-\s].*?\s*?Association

前 2 個備選方案匹配相同的文本,只有第二個備選方案帶有正面的后視。

您可以省略第二個替代方案,因為沒有任何斷言的第一個替代方案已經匹配它,或者如果第一個不匹配它,第二部分也將不匹配它。

由於模式從左到右匹配並遇到第一次出現American ,因此第一個和第二個備選方案無法匹配American College of Cardiology

然后第三個交替可以匹配它,並且由於.*? 它可以一直延伸到第一次出現關聯。


例如,您可能會使用否定字符 class排除可能匹配的字符:

\bAmerican\b[^/,.]*\bAssociation\b

正則表達式演示

或者您可以使用緩和的貪婪令牌方法來不允許在第一部分和最后一部分之間使用特定單詞:

\bAmerican\b(?:(?!American\b|Association\b).)*\bHeart Association\b

正則表達式演示

是`a

[英]Is `a<b<c` valid python?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM