R中的字符串重排

时间:2014-01-03 13:14:01

标签: regex string r gsub

我正在寻找两个可以执行以下字符串重排的R函数: (1)将部分放在字符串开头的字符串中的“,”之后,例如

name="2,6-Octadien-1-ol, 3,7-dimethyl-, (E)-"

应该产生

"(E)-3,7-dimethyl-2,6-Octadien-1-ol"

(请注意,字符串中可能有任何数量的“,”,或者根本没有,并且“,”之后的部分应该连续放置在字符串的开头,从结尾开始在R中实现这个目标的最有效方法是什么?(不使用循环等)?

(2)将部分放在“<”之间和“>”在字符串的开头并删除任何“,”。 例如。

name="Pyrazine <2-acetyl-, 3-ethyl->"

应该产生

"2-acetyl-3-ethyl-Pyrazine"

(这是一个更简单的gsub问题,对吧?) “&lt;”之间的部分和“&gt;”可能在字符串中的任何位置。 E.g。

name="Cyclohexanol <4-tertbutyl-> acetate" 应该产生

"4-tertbutyl-Cyclohexanol acetate"

欢迎任何想法!

欢呼声, 汤姆

1 个答案:

答案 0 :(得分:1)

  1. 第一个问题:

    name <- c("2,6-Octadien-1-ol, 3,7-dimethyl-, (E)-",
      "2,6-Octadien-1-ol,3,7-dimethyl-,(E)-")
    
    sapply(strsplit(name, "(?<!\\d), ?", perl = TRUE), function(x) 
      paste(rev(x), collapse = ""))
    # [1] "(E)-3,7-dimethyl-2,6-Octadien-1-ol" "(E)-3,7-dimethyl-2,6-Octadien-1-ol"
    
  2. 第二个问题:

    name <- c("Pyrazine <2-acetyl-, 3-ethyl->", 
              "Cyclohexanol <4-tertbutyl-> acetate")
    
    inside <- gsub(", ", "", sub("^.*<(.+)>.*$", "\\1", name))
    outside <- sub("^(.*) <.*>(.*)$" , "\\1\\2", name)
    paste0(inside, outside)
    # [1] "2-acetyl-3-ethyl-Pyrazine"        "4-tertbutyl-Cyclohexanol acetate"