繁体   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