使用R中的gsub在子字符串周围插入点

时间:2014-01-04 19:21:04

标签: r gsub string-substitution

我想在R中有一个函数,如果它们尚不存在,则在给定的子字符串(例如“alpha”)周围插入点(“。”)。例如。 string="10-alpha-epoxy-Amorph-4-ene"应该返回

"10-.alpha.-epoxy-Amorph-4-ene"

string="alpha-cadolene"应该返回

".alpha.-cadolene"

string=".alpha.-cadolene"应该返回

".alpha.-cadolene"

(子串可能多次出现)

使用R中的gsub实现此目的的最简单方法是什么?

欢呼,汤姆

2 个答案:

答案 0 :(得分:5)

我会做这样的事情:

gsub("[.]?(alpha)[.]?", ".\\1.", c("10-alpha-epoxy-Amorph-4-ene",
                               ".alpha.-cadolene", "alpha.-cadolene",
                                ".alpha-cadolene"                              
                                 ))
[1] "10-.alpha.-epoxy-Amorph-4-ene" ".alpha.-cadolene"             
    ".alpha.-cadolene"              ".alpha.-cadolene"  

编辑对许多字词的概括:

如果您有术语列表,可以使用paste使用create tour正则表达式:

terms <- c('alpha','gamma','beta','delta')

gsub(paste0("[.]?(",paste0(terms,collapse='|'),")[.]?"), ".\\1.", 
                c("10-alpha-epoxy-Amorph-4-ene",
                 ".gamma.-cadolene", "beta.-cadolene",
                 ".delta-cadolene")) 

[1] "10-.alpha.-epoxy-Amorph-4-ene" ".gamma.-cadolene"             
    ".beta.-cadolene"              
[4] ".delta.-cadolene"  

编辑以完整字母获取格雷尔列表:

library(XML)
dat <- readHTMLTable("http://en.wikipedia.org/wiki/Greek_alphabet",
                     strinsAsFactors=FALSE)[[2]]

terms <- as.character(dat$V2[-c(1,2)])
 [1] "alpha"   "beta"    "gamma"   "delta"   "epsilon" "zeta"    "eta"     "theta"   "iota"    "kappa"   "lambda" 
[12] "mu"      "Name"    "Modern"  "nu"      "xi"      "omicron" "pi"      "rho"     "sigma"   "tau"     "upsilon"
[23] "phi"     "chi"     "psi"     "omega"  

答案 1 :(得分:1)

这是一种方式:

R> gsub("-(alpha)-", ".-\\1-.", "10-.alpha.-epoxy-Amorph-4-ene")
[1] "10-.alpha.-epoxy-Amorph-4-ene"
R> gsub("-(alpha)-", ".-\\1-.", "10-alpha-epoxy-Amorph-4-ene")
[1] "10.-alpha-.epoxy-Amorph-4-ene"
R> 

保留(....)表达式,以便在替换部分中将其作为\\1(其中第二个此类表达式为\\2)进行调用。

但明确命名表达式,您确保不会发生其他匹配。你当然可以概括一下:

gsub("-([a-z]*)-", ".-\\1-.", "10-.alpha.-epoxy-Amorph-4-ene")

将替换任何小写字母的表达式(但不是标点符号,数字......)。