正则表达式在选择中包括先行字符串

Regex includes Lookahead strings in selection

我试图从大量回声报告中提取特定类型心脏功能障碍(舒张功能障碍)的程度(Mild/Moderate/Severe)。

Here is the link to the sample excel file with 2 of those echo reports.

这些行通常这样表示:“轻度左室舒张功能障碍”或“轻度舒张功能障碍”。在这里,“温和”是我要提取的。

我写了以下模式:

pattern <- regex("(\b\w+\b)(?= (lv )?(d(i|y)astolic|distolic) d(y|i)sfunction)",
                               ignore_case = FALSE)

现在,让我们看看结果(记住我想要“温和”部分而不是“LV”部分):

str_view_all(df$echo, pattern)

正如您在“轻度舒张功能障碍”这样的字符串中看到的,该模式正确地选择了“轻度”,但是当谈到“轻度 LV 舒张功能障碍”时,模式选择了“LV”,即使我已经带来了 lv 在一个积极的前瞻 (?= ( lv)?) 结构中。

有人知道我做错了什么吗?

问题是 \w+ 匹配任何一个或多个单词字符,并且前瞻不会消耗它匹配的字符(正则表达式索引保持在原来的位置)。

因此,LV\w+ 匹配,因为紧跟其后的是 diastolic dysfunction,而 ( lv)? 是一个 可选 组(在 diastolic dysfunction 之前可能没有 space+lv)来匹配 \w+

如果您不想匹配 LV,请添加否定前瞻以限制 \w+ 匹配的内容:

\b(?!lv\b)\w+\b(?=(?:\s+lv)?\s+d(?:[iy]a|i)stolic d[yi]sfunction)

regex demo

另外,注意[iy]better way写成(i|y).

在R中,你可以定义为

pattern <- regex(
    "\b(?!lv\b)\w+\b(?=(?:\s+lv)?\s+d(?:[iy]a|i)stolic\s+d[yi]sfunction)",
    ignore_case = FALSE
)

使用\w+也可以匹配LV,lv 部分是可选的

除了前瞻,您还可以使用捕获组。

\b(?!lv)(\w+)\b (?:lv )?(?:d[iy]astolic|distolic) d[iy]sfunction

regex demo