限制环视范围

Limiting the scope of lookaround

我在 R 中使用正则表达式引擎,我想让正则表达式查找不超过 3-8 个单词的特定单词。我该怎么做?

如果您需要更多详细信息,我正在尝试从大量回声报告中提取特定类型心功能障碍(收缩功能障碍)的程度 (Mild/Moderate/Severe)。每颗心脏有2个心室,我要提取的是左心室(lv)的收缩功能障碍,而不是右心室(rv)

所以是的:“左心室扩大,有一定程度的轻度到中度收缩功能障碍” 并且没有:“扩大的 rv 室具有一定程度的轻度至中度收缩功能障碍”

在 echo 报告中讨论了 rv 和 lv 功能障碍,所以我自然

想要使用环视来排除在某处有 3-8 个单词的“rv”的情况,例如“轻度收缩功能障碍”

我试过像这样向后看

(?<!rv(\s+\w+\s+){3,8})

但我收到以下错误:

“后视模式匹配必须有一个有界的最大长度”

P.S: 我正在使用 stringr

我使用的代码是这样的:

lv_systolic_dysfunction <- "(?i)(?<!rv(\s+\w+\s+){3,8}))\b(?!lv\b)((?:\w+\s+to\s+)?\w+)\b(?=(?:\s+lv)?\s+s[yi]stolic\s+d[yi]sfunction)"

您需要通过仅在回顾中使用限制量词来确保回顾模式具有“有界最大长度”,因为 + 量词匹配 一个或多个 事件。虽然它限制下限(为 1),但不限制上限。

看到一个sample R demo:

library(dplyr)
library(stringr)
df <- tibble(test = c("normal rv with mild to moderate systolic dysfunction"))
lv_systolic_dysfunction <- "(?<!\brv(?:\s{1,100}\w{1,100}){3,5}\s{1,100})\bmild to moderate\b"
str_view_all(df$test, lv_systolic_dysfunction)

参见what this regex means here\s{1,100} 匹配 1 到 100 个空格,\w{1,100} 匹配 1 到 100 个单词字符,这就是“有界”的意思,上下限。数字是任意的,按照常识选择你的数据即可。普通文本中单词之间的空格不太可能超过 2 个(我在这里设置 100 只是作为一个极端的例子)。一个单词模式允许 100 个字符就足够了。按您认为合适的方式进行调整。

输出:

查看 R stringr 正则表达式函数中使用的 ICU 正则表达式风格中的 YT demo of this constrained-width lookbehind 功能。