【问题标题】:Split string when a capital letter follows a lower cap letter in the middle of a word in R当大写字母在R中的单词中间跟随小写字母时拆分字符串
【发布时间】:2014-02-06 01:37:35
【问题描述】:

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

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

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

有什么想法可以使用strsplit 和/或gsub 正则表达式来实现这一点吗? 我想使用的规则是,当数字、括号(“(”)或大写字母跟随小写字母时,我想拆分一个单词。有什么想法吗?

【问题讨论】:

    标签: regex string r


    【解决方案1】:

    您可以使用正向环视断言来查找(然后拆分)字符间位置,该位置以小写字母开头,后跟大写字母、数字或(

    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"
    

    【讨论】:

    • 非常感谢大家的回答 - 我会接受这个,因为它最接近我的确切问题,但一切似乎都很完美!谢谢!!
    • 乔希,我在这里学到了一些东西。看起来您可以在 [ ] 集合中包含 ( 而无需转义它。我理解正确吗?
    • @RicardoSaporta -- 是的,没错。引用?regex,“只有'^ - \ ]' 是特殊的内部字符类”(其中“字符类”指的是外括号[])。
    • 这是一个sexayyyy正则表达式
    【解决方案2】:
    strsplit(name, "(?<=([a-z]))(?=[A-Z]|[0-9]|\\()", perl=TRUE)
    # [[1]]
    # [1] "o-n-Butylhydroxylamine"      "1-Methylpropylhydroxylamine" "Amino-2-butanol"
    

    记住返回值是一个列表,所以如果合适的话使用[[1]]

    【讨论】:

      【解决方案3】:

      试试这个:

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

      它假设一个非大写字母后跟一个数字是一个拆分以及一个非大写字母后跟一个大写。

      【讨论】:

      • 哈哇酷 - 非常感谢!!你真的很擅长那些正则表达式 - 我真的需要阅读它们!
      猜你喜欢
      • 2019-08-08
      • 2021-01-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-06
      • 1970-01-01
      • 2017-01-28
      • 1970-01-01
      相关资源
      最近更新 更多