2

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

这是带有 2 个回声报告的示例 excel 文件的链接

线条通常这样表达:“轻度LV 舒张功能障碍”或“轻度舒张功能障碍”。在这里,“温和”是我要提取的。

我写了以下模式:

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)?)结构。

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

4

2 回答 2

2

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

因此,LV被匹配,\w+因为它diastolic dysfunction紧随其后,并且 ( lv)?是一个可选lv组(之前可能没有空格+ diastolic dysfunction)用于\w+匹配)。

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

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

查看正则表达式演示

另外,请注意这[iy]是一种更好的编写方式(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
)
于 2021-09-03T09:25:45.057 回答
1

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

您还可以使用捕获组,而不是前瞻。

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

正则表达式演示

于 2021-09-03T09:28:30.080 回答