提问者:小点点

具有多个可能模式的正则表达式[重复]


我正在寻找匹配多个模式(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)

共1个答案

匿名用户

我相信你需要

ptrn <- "Z(ABC|ACD|EFG)Y"

(方括号[]表示字符集;()保护您的ABC备选方案不被解读为ZABC,类似地,EFGY

但是,我对您的预期输出有点困惑。我明白了

  start end
1     1   5
2     7  11

ZY使用“向前看”和“向后看”表达式可能是您的想法:

ptrn <- "(?<=Z)(ABC|ACD|EFG)(?=Y)"

这与ZY匹配,但在计算命中位置时不包括它们,因此第一次命中被给出为(2,4),这可能是您想要的

在评论中指出,如果您想使用lookahead/lookback((?…)填充)使用基本R函数(gsub()grep()grepl()等),然后必须指定perl=TRUE