当大写字母跟随R中单词中间的下限字母时,拆分字符串

时间:2014-01-16 21:59:11

标签: regex string r

我遇到了一些连接不同字符串的问题,我想再次拆分。 我正在处理诸如

之类的事情
name="o-n-Butylhydroxylamine1-MethylpropylhydroxylamineAmino-2-butanol"

在这种情况下应分开 "o-n-Butylhydroxylamine", "1-Methylpropylhydroxylamine""Amino-2-butanol"

我是否有任何想法可以使用strsplit和/或gsub正则表达式来实现这一目标? 我想要使​​用的规则是,当数字,括号(“(”)或大写字母跟在小写字母后面时,我想分开一个单词。有什么想法怎么做?

3 个答案:

答案 0 :(得分:10)

您可以使用正向环顾断语来查找(然后拆分)字符间位置,前面是小写字母,后面是大写字母,数字或(

name <- "o-n-Butylhydroxylamine1-MethylpropylhydroxylamineAmino-2-butanol"
pat <- "(?<=[[:lower:]])(?=[[:upper:][:digit:](])"
strsplit(name, pat, perl=TRUE)
# [[1]]
# [1] "o-n-Butylhydroxylamine"      "1-Methylpropylhydroxylamine"
# [3] "Amino-2-butanol"

答案 1 :(得分:3)

strsplit(name, "(?<=([a-z]))(?=[A-Z]|[0-9]|\\()", perl=TRUE)
# [[1]]
# [1] "o-n-Butylhydroxylamine"      "1-Methylpropylhydroxylamine" "Amino-2-butanol"

请记住,返回值是一个列表,因此如果合适,请使用[[1]]

答案 2 :(得分:2)

试试这个:

name="o-n-Butylhydroxylamine1-MethylpropylhydroxylamineAmino-2-butanol"
print(strsplit(gsub("([a-z])(\\d)","\\1#\\2",
                    gsub("([a-z])([A-Z])","\\1#\\2",name)),"#")[[1]])

它假定一个非上限字母后跟一个数字是一个分割,一个非上限后跟一个上限。