正则表达式与特定单词不匹配但与其他模式匹配

时间:2018-03-07 19:28:04

标签: regex python-3.x

我正在处理临床记录,并且作为预处理的一部分,我想用各种表达年龄的方法替换为单一的记号。例如,"患者是一名30岁的男性",我想用&#34替换它;患者是30岁的男性"。这个"岁的方式有很多种。是在临床记录中写的,我试图尽可能多地捕获它们。

我正在使用Python的re模块。目前我有:

# matches: y.o., y/o, years old. year old, yearold
s = re.sub(r'(\w*)y\.?\/?(o|ears|ear)\.? ?(old)? ?', r'\1 year_old ', s)

有了这个,我能够匹配:y.o.,岁,岁,岁,哟,y / o,24岁,24岁。不幸的是,只有"年"和"年"也匹配。所以,"九年前"变成九年前"。我想避免匹配"年"和"年"并匹配我指定的其他模式。我该怎么做?我的搜索告诉我,我必须使用负向前瞻,但我不知道该怎么做。

由于

1 个答案:

答案 0 :(得分:3)

See regex in use here

(\d+)(?: ?(?:years? ?old|y[ .\/]*o\.?))
  • (\d+)将一个或多个数字捕获到捕获组1
  • (?: ?(?:years? ?old|y[ .\/]*o\.?))符合以下条件
    • ?可选择匹配空格(数字与年前文字之间)
    • (?:years? ?old|y[ .\/]*o\.?)匹配以下任一项
      • years? ?old匹配year,可选地匹配s,可选地匹配空格,匹配old。所以它匹配以下内容:
        • years old
        • yearsold
        • year old
        • yearold
      • y[ .\/]*o\.?匹配y,然后匹配任意数量的空格./,然后o,然后.。所以它匹配以下(加上更多):
        • y.o.
        • y.o
        • yo
        • y/o
        • y/o.
        • y./o.
        • y o
        • y. o.

为了使其更匹配,您可以启用不区分大小写的i标志,以便它也匹配大写变体,例如Y.O.Years Old