gpt4 book ai didi

Python 正则表达式否定回顾

转载 作者:太空宇宙 更新时间:2023-11-04 10:20:13 26 4
gpt4 key购买 nike

我有一个大型 CT 扫描结果和印象数据库。我正在尝试构建一个正则表达式,用于搜索整数或 float ,后跟与前面或后面的单词“结节”相邻的“mm”。到目前为止,这是我为此使用的正则表达式:

nodule_4mm_size = "(?s).*?([0-4]*\.*[0-9]+\s*[mM]{2})[\w\W]{0,24}[Nn]odule|(?s)[Nn]odule[\w\W]{0,24}.*?([0-4]*\.*[0-9]+\s*[mM]{2})”

但是,我需要确保这些发现之前没有之前或之前的测量结果。放射科医生指的是以前的扫描。所以我正在尝试消极的回顾,就像这样:

(?<!previously measured)\?[Nn]odule[\w\W]{0,24}[^\.\d]([0-4]\s*[mM]{2}|[0-3]\.[0-9]\s*[mM]{2}|4\.0+\s*[mM]{2})

但是,我无法让它工作。以下面这段话为例。

"For example, the largest nodule which is located in the right lower lobe and currently measures 4.4 mm (image #82, series 3) previously measured 3.6 mm on 09/01/2011."

在这种情况下,我希望正则表达式命中 4.4 毫米而不是 3.6 毫米。此外,如果发现多个命中,我只想保留找到的最大尺寸。例如,

"For example, the largest nodule which is located in the right lower lobe and currently measures 4.4 mm (image #82, series 3) previously measured 3.6 mm on 09/01/2011. Another nodule was found measuring 2.2 mm.

在这种情况下,我想确保只识别出 4.4 毫米。

任何帮助将不胜感激。就是不能让这种消极的回顾工作!谢谢!

最佳答案

让我们分解它,保留相关部分。到目前为止,您有 2 个选择:

选项 1(数字后跟“结节”):

([0-4]\.\d+\s*[mM]{2})[\s\S]{0,24}[Nn]odule

选项 2(“结节”后跟数字):

[Nn]odule[\s\S]{0,24}([0-4]\.\d+\s*[mM]{2})

您应该知道正则表达式引擎是 greedy .这意味着 [\s\S]{1,24} 将尝试尽可能多地匹配,匹配不一定最接近“结节”的数字.例如,

Pattern: [Nn]odule[\s\S]{0,24}([0-4]\.\d+\s*[mM]{2})

Text: ... nodule measured 1.4 mm. Another 3.2 mm ...
^ ^
| |
matches this second occurence. +----+

要解决此问题,请在量词后添加额外的 ? 使其成为 lazy .因此,不要使用 [\s\S]{0,24},而是使用 [\s\S]{0,24}?


For example, the largest nodule which is located in the right lower lobe and currently measures 4.4 mm

此示例中的“nodule”由超过 24 个字符分隔。您应该增加中间的字符数。也许 [\s\S]{0,70}?


So I am trying a negative lookbehind

Lookbehinds 仅断言紧接在特定位置之前的文本。为避免这种情况,我建议匹配文本“previously measured”,并在其周围消耗一些字符。那么,您怎么知道不考虑这些情况呢?简单,不要创建捕获。所以你会匹配类似的东西

[\s\S]{0,10}previously measured[\s\S]{0,10}

并丢弃匹配项,因为它没有返回任何组。此外,您可以在此处包含不同的异常(exception)情况:

[\s\S]{0,10}(?:previously measured|previous scan|another patient|incorrectly measured)[\s\S]{0,10}

if multiple hits are found I would like to only keep the largest size found

你不能用正则表达式来做到这一点。循环您的代码以找到最大的。


结果:

有了这些条件,我们有:

[\s\S]{0,10}previously measured[\s\S]{0,10}|([0-4]\.\d+\s*[mM]{2})[\s\S]{0,70}?[Nn]odule|[Nn]odule[\s\S]{0,70}?([0-4]\.\d+\s*[mM]{2})

DEMO


要检查的额外条件

也许,为了减少误报,以下选项之一变得有用:

  1. 不允许在换行后进行匹配。
  2. 如果“nodule”和数字之间有句号,则不匹配。
  3. 寻找接近测量的日期。

关于Python 正则表达式否定回顾,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32704676/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com