按照模式拆分字符串而不删除模式字符串。

4
针对以“pr”开头并跟随多个“r”的模式,例如pr,prr,pr ... r ,我想分割非模式字符串和所有模式字符串,而不删除模式。 strsplit()可以完成这项工作,但会删除所有的pr..r。然而,stringr :: str_extract_all 提取了模式字符串,但去除了非模式字符串。

是否有一种简单的方法来保留所有字符串,但是单独挑选出模式字符串呢?

x<-c("zprzzzprrrrrzpzr")

"z" "pr" "zzz" "prrrrr" "zpzr" # desired output; keep original character order
2个回答

3
这有点巧妙,但你可以进行一次替换来使用某个分隔符将所需的值分离出来,然后在该分隔符上进行分割。例如:
unlist(strsplit(gsub("(pr+)","~\\1~", x), "~"))
# [1] "z"      "pr"     "zzz"    "prrrrr" "zpzr" 

如果字符串中没有“~”符号,那么这将正常工作。


1
有任何线索为什么这个正则表达式在 R 中不起作用(当然需要双重转义和 perl)?链接 - jay.sf
@jay.sf,好问题。我不太确定这个。你是像这样使用它的吗:strsplit(x, r'{(?=pr)|pr+\K}',perl=T) - MrFlick
是的,strsplit(x, '(?=pr)|pr+\\K', perl=TRUE),看起来与演示不同。 - jay.sf

1

这里有一种使用 stringr 的方法。我希望能够更加简洁。

  • 使用 str_locate_all() 定位模式。
  • 将所有结束位置加一,以便我们有分割位置。
  • 将开始和结束位置添加到向量中以正确拆分。
  • 使用矢量化的 str_sub() 提取它们全部。
library(stringr)

x <- c("zprzzzprrrrrzpzr")

locs <- str_locate_all(x, "(pr+)")[[1]]
locs[,2] <- locs[,2] + 1

locs_all <- sort(c(1, locs, nchar(x) + 1))

str_sub(x, head(locs_all, -1), tail(locs_all, -1))
# [1] "zp"      "prz"     "zzzp"    "prrrrrz" "zpzr"   

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接