0

我的目的是发现患者是否患有高血压。

这应该匹配:

患者患有糖尿病、高胆固醇和高血压。

患者糖尿病、高胆固醇和高血压呈阳性。

这不应该匹配:

患者没有糖尿病、高胆固醇或高血压。

已知患者没有糖尿病、高胆固醇或高血压。

我可以使用它来匹配两者:

patient[^\.]{0,}?hypertension

但是,这在http://gskinner.com/RegExr/上不起作用(仍然匹配两者):

patient[^\.]{0,}?(?!no)[^\.]{0,}?hypertension

那么,如何排除“患者”和“高血压”之间包含“否”的匹配项?

请记住,“患者”、“否”和“高血压”之间可能有任意数量的字符。

非常感谢!!!

PS:我知道否定查找可能比这更复杂,但是,就我目前的努力而言,仅识别表示否定的单词就足够了。

4

2 回答 2

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.

于 2013-11-13T17:55:47.673 回答
0

您可以使用前瞻来匹配一个但不能匹配另一个:

(?=(patient.*hypertension))(?!(patient.*no.*hypertension))

就像 Rohit & Casimir 提到的那样,正则表达式不是该任务的正确工具:您应该构建一个解析器,其中包含您可以使用的所有选项(例如 Casimir 展示的“双重否定”),而且很可能您当您遇到您错过的其他可能性时,您必须不时更新解析器。

于 2013-11-13T18:20:29.747 回答