我的目的是发现患者是否患有高血压。
这应该匹配:
患者患有糖尿病,高胆固醇和高血压。
患者对糖尿病,高胆固醇和高血压有阳性。
这不应该匹配:
患者没有糖尿病,高胆固醇或高血压。
众所周知,患者没有糖尿病,高胆固醇或高血压。
我可以用它来匹配两者:
patient[^\.]{0,}?hypertension
但是,这在http://gskinner.com/RegExr/上不起作用(仍然匹配):
patient[^\.]{0,}?(?!no)[^\.]{0,}?hypertension
那么,如何排除“患者”和“高血压”之间包含“否”的匹配?
请记住,任何数量的字符可能介于“患者”,“否”和“高血压”之间。
非常感谢!!!
P.S。:我知道否定发现可能比这更复杂,但是,对于我目前的努力,仅仅识别意味着否定的词语就足够了。
答案 0 :(得分:0)
为人类语言编写防水正则表达式很困难,但我建议您使用的模式可以让您了解如何继续:
\bpatient\b(?>[^nhi.]++|\B[nhi]|n(?!o\b)|h(?!ypertension\b)|i(?!s\s+negative\s+for\b|sn't\s+known\s+to\s+have\b))+hypertension\b
然而,带有双重否定的句子会使模式失败:
示例:The patient isn't known to have diabetes, but hypertension.
答案 1 :(得分:0)
您可以使用前瞻来匹配一个而不是另一个:
(?=(patient.*hypertension))(?!(patient.*no.*hypertension))
和Rohit& Casimir提到,正则表达式不是正确的任务工具:你应该构建一个包含你可以选择的所有选项的解析器(例如Casimir所展示的“双重否定”),并且很可能你必须更新解析器偶尔会遇到你错过的其他可能性。