【问题标题】:Look for specific character in string and place it at different positions after a defined separator in the same string在字符串中查找特定字符并将其放置在同一字符串中定义的分隔符之后的不同位置
【发布时间】:2012-07-18 10:16:31
【问题描述】:

让我们定义以下字符串s

s <- "$ A; B; C;"

我需要将s 翻译成:

"$ A; $B; $C;"

分号是分隔符。但是,$ 只是可以出现在字符串中的 3 个特殊字符之一。数据框m 包含所有 3 个特殊字符:

m <- data.frame(sp = c("$", "%", "&"))

我首先使用strsplit来分割字符串,使用分号作为分隔符

> strsplit(s, ";")
[[1]]
[1] "$ A" " B"  " C" 

我认为下一步是使用 grep 或 match 来检查第一个字符串是否包含数据框 m 中定义的 3 个特殊字符中的任何一个。如果是这样,也许使用 gsub 将匹配的特殊字符插入到剩余的子字符串中。然后简单地使用 paste with collapse = "" 再次将子字符串合并在一起。这有意义吗?

干杯

【问题讨论】:

    标签: regex string r split pattern-matching


    【解决方案1】:

    这样的事情怎么样:

    getmeout = gsub("[$|%|& ]", "", unlist(strsplit(s, ";")))
    whatspecial = unique(gsub("[^$|%|&]", "", s))
    whatspecial
    # [1] "$"
    getmeout
    # [1] "A" "B" "C"
    paste0(whatspecial, getmeout, sep=";", collapse="")
    # [1] "$A;$B;$C;"
    

    【讨论】:

    • 酷。请注意,在 [] 内转义 $&amp;% 字符是不必要的。
    • @AriB.Friedman,我不知道。谢谢。我将编辑我的答案。
    • 当然。您也可以消除|'s。 [] 内部的所有规则都发生了变化。它假定您指定“OR”,因此不需要管道。您实际上正在寻找四个字符:$&amp;%|。演示示例:&gt; grepl("[A|B]","$%&amp;|") TRUE&gt; grepl("[AB]","$%&amp;|") FALSE
    • @AriB.Friedman,很酷。实际上,我并没有用正则表达式做很多事情——通常只是非常基本的清理——所以感谢你的课程!
    • 非常感谢您提供的解决方案。它看起来对我来说是最简单的并且可以完成它的工作! :-))
    【解决方案2】:

    这是一种方法:

    library(stringr)
    separator <- '; '
    
    # extract the first part
    first.part <- str_split(s, separator)[[1]][1]
    first.part
    # [1] "$ A"
    
    # try to identify your special character
    special <- m$sp[str_detect(first.part, as.character(m$sp))]
    special
    # [1] $
    # Levels: $ & %
    
    # make sure you only matched one of them
    stopifnot(length(special) == 1)
    
    # search and replace
    gsub(separator, paste(separator, special, sep=""), s)
    # [1] "$ A; $B; $C;"
    

    如果我错过了你的一些假设,请告诉我。

    【讨论】:

    • 我最近使用了库 stringr 中的方法。那里有很好的方法来做这样的工作!也感谢您提供该解决方案!
    【解决方案3】:

    反向引用将其变成单行:

    s <- c( "$ A; B; C;", "& A; B; C;", "% A; B; C;" )
    ms = c("$", "%", "&")
    
    s <- gsub( paste0("([", paste(ms,collapse="") ,"]) ([A-Z]); ([A-Z]); ([A-Z]);") , "\\1 \\2; \\1 \\3; \\1 \\4" , s) 
    
    > s
    [1] "$ A; $ B; $ C" "& A; & B; & C" "% A; % B; % C"
    

    然后,如果需要,您可以使正则表达式适当地通用(匹配多个空格、多个字母数字字符等)。

    【讨论】:

    • 也感谢您的解决方案。无论如何,同样使用 gsub 和 paste0 命令! :) 太好了!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多