我正在尝试正则表达式((?: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-I3
,I1-I1-I3-I1-I1-I3-I2
和I3
- 这是所需的行为。但是,在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?
答案 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"