协调正则表达式行为

时间:2015-07-31 14:25:55

标签: regex r

我正在尝试正则表达式((?:I\d-?)*I3(?:-?I\d)*here

在字符串A-B-C-I1-I2-D-E-F-I1-I3-D-D-D-D-I1-I1-I3-I1-I1-I3-I2-L-K-I3-P-F-I2-I2之外,我得到以下匹配I1-I3I1-I1-I3-I1-I1-I3-I2I3 - 这是所需的行为。但是,在R:

x <- "A-B-C-I1-I2-D-E-F-I1-I3-D-D-D-D-I1-I1-I3-I1-I1-I3-I2-L-K-I3-P-F-I2-I2"
strsplit(x, "(?:I\d-?)*I3(?:-?I\d)*")

这会返回错误:

Error: '\d' is an unrecognized escape in character string starting ""(?:I\d"

我尝试了perl=TRUE,但它并没有什么区别。

我还尝试将正则表达式修改为:(?:I\\d-?)*I3(?:-?I\\d)*,但是这不会给出正确的结果,而是匹配A-B-C-I1-I2-D-E-F--D-D-D-D--L-K-,和-P-F-I2-I2。 ` 如何在R?

中复制所需的行为

1 个答案:

答案 0 :(得分:1)

如果我们需要split字符串并根据显示的模式获取子字符串,我们可能会将其用作要跳过的模式((*SKIP)(*F))并将字符串拆分为其余部分人物。

 v1 <- strsplit(x, '(?:I\\d-?)*I3(?:-?I\\d)*(*SKIP)(*F)|.', perl=TRUE)[[1]]

可以使用nzchar删除空白/空元素,以返回逻辑向量TRUE / FALSE,具体取决于字符串是否为空或空白。

 v1[nzchar(v1)]
 #[1] "I1-I3"                "I1-I1-I3-I1-I1-I3-I2" "I3"   

或者我们对提取模式感兴趣,str_extract会很有用。

 library(stringr)
 str_extract_all(x, '(?:I\\d-?)*I3(?:-?I\\d)*')[[1]]
 #[1] "I1-I3"                "I1-I1-I3-I1-I1-I3-I2" "I3"