R 模式匹配与正则表达式的子集 data.table

Posted

技术标签:

【中文标题】R 模式匹配与正则表达式的子集 data.table【英文标题】:R pattern matching with regex for subsetting data.table 【发布时间】:2022-01-05 16:49:48 【问题描述】:

我需要进行模式匹配以用于对 data.table 进行子集化。我不确定如何使用转义或任何带有通配符的正确语法。 MWE在这里:

library(data.table)
code_id <- data.table (c("pat11",
                         "pat11",
                         "pat21",
                         "pat22",
                         "x05ZX",
                         "x05q2",
                         "x05qb",
                         "x05td",
                         "x05xd",
                         "x05qb"))

codes <- c("pat2.", "x05td", "x05q.")

unique (code_id[code_id %in% codes])

这将返回一个空向量。我想对 code_id 进行子集化并只保留代码“pat21”、“pat22”、“x05td”、“x05q2”和“x05qb”?我猜问题是试图在值列表的中间进行正则表达式匹配 我如何需要“转义”或格式化“。”所以它被视为通配符?谢谢。 J

【问题讨论】:

【参考方案1】:

两种可能的解决方案: 两者共同的想法是将codes 转换为交替模式,其中单独的元素由| 连接(注意:我已经删除了codes 中的.,因为这是一个正则表达式元字符)

使用dplyr

library(dplyr)
library(stringr)
code_id %>% filter(str_detect(V1, paste0(codes, collapse = "|")))
      V1
1: pat21
2: pat22
3: x05q2
4: x05qb
5: x05td
6: x05qb

使用base R

code_id[grepl(paste0(codes, collapse = "|"), V1)]
      V1
1: pat21
2: pat22
3: x05q2
4: x05qb
5: x05td
6: x05qb

数据:

codes <- c("pat2", "x05td", "x05q")

code_id <- data.table (c("pat11",
                         "pat11",
                         "pat21",
                         "pat22",
                         "x05ZX",
                         "x05q2",
                         "x05qb",
                         "x05td",
                         "x05xd",
                         "x05qb"))

【讨论】:

谢谢克里斯,这些肯定会奏效。我仍然有一个问题,因为在实际的真实示例中,我必须匹配多个代码,所以我正在寻找类似于 "codes 没有完全的意义。请用更现实的例子更新您的问题,但组合多种模式根本不是问题 已编辑解决方案以适应多种模式 通过包含^$,这可能会更严格一些(如果需要/需要),例如paste0("^", paste(codes, collapse="|"), "$");这样,不太可能匹配太多。

以上是关于R 模式匹配与正则表达式的子集 data.table的主要内容,如果未能解决你的问题,请参考以下文章

正则表达式查找单词的最佳匹配子集

Python 模式匹配与正则表达式

正则表达式

Go 语言入门很简单:正则表达式

第 7章 模式匹配与正则表达式(7.9-7.11)

将lookbehind模式与匹配的正则表达式搜索模式分组以作为整体替换