首页 > 解决方案 > 限制环视范围

问题描述

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

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

所以是的:“扩大的 lv 腔室伴有某种程度的轻度至中度收缩功能障碍”,而不是:“扩大的 rv 腔室伴有某种程度的轻度至中度收缩功能障碍”

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

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

我试着像这样向后看

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

但我收到以下错误:

“Look-Behind 模式匹配必须有一个有界的最大长度”

PS:我正在使用 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)"

标签: rregexregex-lookarounds

解决方案


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

查看示例 R 演示

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)

在此处查看此正则表达式的含义\s{1,100}匹配 1 到 100 个空格并\w{1,100}匹配 1 到 100 个单词字符,这就是“有界”的含义,从下到上都有上限。这些数字是任意的,选择它们时请遵循常识和您的数据。普通文本中的单词之间不可能有超过 2 个空格(我在这里设置 100 只是作为一个极端示例)。一个单词模式允许 100 个字符就足够了。调整你认为合适的。

输出:

在此处输入图像描述

请参阅R正则表达式函数中使用的 ICU 正则表达式风格中此约束宽度后向功能的YT 演示。stringr


推荐阅读