我正在寻找匹配多个模式(ptrn),这些模式在“数据”中匹配ZABCY、ZACDY或ZEFGY。我写了下面的代码,但是我的“输出”是空的。我期望有预期的产出。我哪里做错了?
require(stringr)
data <- "ZABCYDZEFGYHZY"
ptrn <- "Z[ABC|ACD|EFG]Y"
output <- data.frame(str_locate_all(data, ptrn))
expected.output <- data.frame(2, 4)
我相信你需要
ptrn <- "Z(ABC|ACD|EFG)Y"
(方括号[]
表示字符集;()
保护您的ABC
备选方案不被解读为ZABC
,类似地,EFGY
)
但是,我对您的预期输出有点困惑。我明白了
start end
1 1 5
2 7 11
对Z
和Y
使用“向前看”和“向后看”表达式可能是您的想法:
ptrn <- "(?<=Z)(ABC|ACD|EFG)(?=Y)"
这与Z
和Y
匹配,但在计算命中位置时不包括它们,因此第一次命中被给出为(2,4),这可能是您想要的
在评论中指出,如果您想使用lookahead/lookback((?…)代码>填充)使用基本R函数(
gsub()
,grep()
,grepl()
等),然后必须指定perl=TRUE
。