如何使用否定前瞻来忽略带有正则表达式(regex)的多个单词短语?

How to use negative lookahead to ignore multiple word phrases with regular expressions (regex)?

我正在执行一项任务,使用 Python3 中实现的正则表达式识别和计算医学放射学文本报告中特定单词和短语的出现次数。

我的正则表达式适用于大多数 words/phrases 感兴趣的内容,但不适用于单词 'mass'。这是因为单词 'mass' 出现在许多不同的上下文中,其中一些我希望忽略,而另一些我希望计算在内。 IE。我想知道什么时候 'mass' 描述了心脏中存在的异常结构,但我不想知道什么时候 'mass' 被用来告诉我心脏的重量。

例如: “RA 中有一个 2mm 的肿块”是有效的 “左心室不规则大肿块”是有道理的 “LV质量:135g”无效 “正常心脏质量”无效

为此,我使用否定前瞻来指定在 'mass' 之前要忽略的单词示例。

\b((?:(?!\bLV\s\b|\band\b|\bindexed\b\s)[\S]){2,}\smass)\b

但在某些情况下,我需要查看的不仅仅是 'mass'

之前的单词

例如“心脏质量”是有效的(我需要知道心脏有异常结构!) 但是“没有心脏肿块”是无效的(我不想知道有没有异常!)

我试过类似的东西:

\b((?:(?!\bLV\s\b|\band\b|\bnormal\b|\b[Nn]o\s\b[Cc]ardiac\b|\bindexed\b\s)[\S]){2,}\smass)\b

但它不会理解“心脏质量”有效而“无心脏质量”无效的事实。

我主要是想忽略感兴趣的词前的多个词

文本没有刻板印象,所以我正在寻找一个解决方案,当我遇到 words/phases 我希望排除的“质量”前面时,我可以通过添加越来越多的实例来忽略。

感谢您的帮助

你可以使用

\b(?!(?:LV|and|normal|(?<=\bno\s+)cardiac|indexed|heart)\b)\w+\s+mass\b

参见regex demo详情:

  • \b - 单词边界
  • (?!(?:LV|and|normal|(?<=\bno\s+)cardiac|indexed|heart)\b) - 与未立即跟随的位置匹配的否定前瞻
    • (?:LV|and|normal|(?<=\bno\s+)cardiac|indexed|heart) - LVandnormalcardiac 紧跟整个单词 no 和一个或多个空格,indexed,心形`
    • \b - 单词边界
  • \w+ - 一个或多个单词字符
  • \s+ - 一个或多个空格
  • mass - mass 字符串
  • \b - 单词边界

注意:要在 Python 中使用它,您需要打开 terminal/console、运行 pip install regex(或 pip3 install regex),然后在您的代码,使用 import regex as re.