【问题标题】:String replace ignoring characters字符串替换忽略字符
【发布时间】:2019-05-26 07:49:36
【问题描述】:

我有以下字符串:

string <- c("ABDSFGHIJLKOP")

和子串列表:

sub <- c("ABDSF", "SFGH", "GHIJLKOP")

我想在每个子匹配之后包含 从而得到:

<ABD><SF><GH><GHIJKOP>

我已经通过对列表的模式匹配尝试了以下代码,但是一旦匹配 ABDSF,SFGH 就不再被识别,因为包含 字符。有人有更好的主意吗?

library(stringr)
library(dplyr)
library(magrittr)

string <- c("ABDSFGHIJLKOP")
sub <- c("ABDSF", "SFGH", "GHIJLKOP")

for (s in sub){

string %<>% str_replace_all(., s, paste0('<', s,'>'))
}

print(string)


Result: [1] "<ABDSF><GHIJLKOP>"

编辑:上面代码的问题是,一旦插入 字符,在第一个字符串匹配后,第二个字符串 SFGH 就不再被识别,因为字符串现在是:

 <ABDSF>GHIJLKOP. 

所以我正在寻找一种方法来匹配忽略 字符的子字符串。

【问题讨论】:

  • 我不明白您如何获得预期的输出。请您详细说明一下吗?
  • 不完全是上述的副本
  • 查看该问题的倒数第三个答案(由 Zach Foster 提供)。可能会有所帮助。
  • 啊我其实是指OP,他的预期输出不符合他的标准,所以我有点困惑。

标签: r regex gsub stringr stringi


【解决方案1】:

[&lt;&gt;]* 放在sub 中的连续字符之间,然后使用这些模式执行替换。没有使用任何包。

# test input
string <- "ABDSFGHIJLKOP"
subs <- c("ABDSF", "SFGH", "GHIJLKOP")

pats <- paste0("(", gsub("(?<=[EF])(.)(?=.)", "\\1[<>]*", subs, perl = TRUE), ")")
s <- string
for(p in pats) s <- gsub(p, "<\\1>", s)
s
## [1] "<ABD<SF><GH>IJLKOP>"

更新

关于下面的评论,如果我理解正确,我们可以添加(?&lt;=[EF])giving:

pats <- paste0("(", gsub("(?<=[EF])(.)(?=.)", "\\1[<>]*", subs, perl = TRUE), ")")
s <- string
for(p in pats) s <- gsub(p, "<\\1>", s)
s
## [1] "<ABDSF><GHIJLKOP>"

【讨论】:

  • 你可以添加一个条件语句吗?例如,仅当前面的字符是 E 或 F 时才添加 ?所以“SFGH”将不会被匹配,因为前一个字符是 D 而不是 E 或 F。
  • 非常感谢您的帮助,非常感谢!我仍然遇到的问题是,例如,如果您想通过将 [EF] 更改为 [E] 来排除“GHIJLKOP”,则它不起作用。结果 = 。我正在寻找 GHIJLKOP.
【解决方案2】:
#R version 3.3.2 

library(stringr)
library(magrittr)

string <- c("ABDSFGHIJLKOP")
sub <- c("ABDSF", "SFGH", "GHIJLKOP")
result <- c("")
for (s in sub){
temp<- c(str_extract(string, s))
if (!is.null(temp)) {
        temp<- paste("<",temp,">",sep = "")
        result <- paste(result,temp,sep = "")

    }
}
print(result)

结果:

[1] "<ABDSF><SFGH><GHIJLKOP>"

Rextester测试

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-08-08
    • 2019-06-30
    • 1970-01-01
    • 2020-12-12
    • 2012-07-14
    • 1970-01-01
    • 1970-01-01
    • 2014-08-16
    相关资源
    最近更新 更多