如何用正则负向前瞻忽略目标词前多词短语匹配特定语境的mass
适配需求的正则实现方案
核心规则(Python 3.10+ 兼容)
直接使用可变长度负向后顾断言实现,后续新增排除短语只需更新断言内的列表即可,匹配时开启忽略大小写标志适配写法差异:
import re # 统一管理需要排除的前置短语,后续新增直接往列表里加 exclude_prefixes = [ r"LV ", r"normal ", r"no cardiac ", r"indexed ", r"heart ", ] # 拼接生成正则 pattern = re.compile( fr"\b(?<!{'|'.join(exclude_prefixes)})mass\b", flags=re.IGNORECASE )
匹配逻辑
(?<!前缀1|前缀2|...)是负向后顾断言,会检查mass单词的前方是否出现过任意一个指定的排除前缀,出现则不匹配- 所有排除规则统一在
exclude_prefixes列表维护,不需要修改正则主体结构,扩展性极强 - 开启
re.IGNORECASE后自动适配No、Normal、CARDIAC这类大小写变体,无需手动写多套匹配规则
用例匹配结果
- 命中(有效匹配)
- There is a 2mm mass in the RA
- large irregular mass in the left ventricle
- cardiac mass
- 不命中(无效匹配)
- LV mass: 135g
- Normal heart mass
- no cardiac mass
低版本Python兼容方案
如果使用的是Python 3.9及以下版本,不支持可变长度负向后顾,可以改用负向前瞻包裹前缀范围的写法,逻辑完全一致:
pattern = re.compile( r"\b(?!LV |normal |no cardiac |indexed |heart )[^\s]{0,100}\s*mass\b", flags=re.IGNORECASE )
内容的提问来源于stack exchange,提问作者PyStiggy
相关产品推荐
相关产品推荐

