【问题标题】:R get the string-matchR获取字符串匹配
【发布时间】:2014-01-10 16:11:40
【问题描述】:

我向上帝发誓,在过去的 60 分钟里,我已经在整个互联网上搜索了“r get match”等谷歌搜索。我不想为这个简单的任务安装任何库。我有一个字符串"something1_something2",我想得到something1

a<-"hi_there"

根据一些论坛条目,我应该用 sub 获得它:

> sub("hi_", "\\1", a)
[1] "there"

我想获得"hi",但我什至无法获得"hi_"。我已经尝试了一千件事,我该怎么做?

【问题讨论】:

  • strsplit(x, "_")[[1]]
  • gsub("(.*)_(.*)", "\\1", a) 很可能是您所想的,但如果您描述条件而不是告诉我们您的搜索历史会有所帮助:-)
  • sub 删除你匹配的!您实际上希望sub("_there", "\\1", a) 得到"hi"。您所描述的是使用regmatches 提取字符串的匹配部分,其工作方式如下:regmatches( a , regexpr( "hi" , a ) )。看,同样的事情。

标签: r get match


【解决方案1】:

尝试 strsplit 将字符串分成块:

x = c("hi_there", "this#is#sparta")
chunks = strsplit(x, c("_", "#"))

# first word
print(chunks[[1]])
[1] "hi"    "there"

# second word
print(chunks[[2]])
[1] "this"   "is"     "sparta"

【讨论】:

    【解决方案2】:

    这可能有点棘手。您需要在与整个字符串匹配的模式中创建一个捕获组,以将整个字符串替换为捕获组中的内容:

    sub("(hi)_.+","\\1",a)
    [1] "hi"
    

    【讨论】:

      【解决方案3】:

      regexec/regmaches 也可以做到这一点,尽管strsplit 方法对于这个特定问题更简单。

      a <- c("hi_there", "something_somthing", "boo_ya_yo")
      sapply(regmatches(a, regexec("^([^_]*)", a)), `[[`, 2)
      # [1] "hi"        "something" "boo"      
      

      这种方法的主要优点是如果您有其他要求(例如,您还希望最左边的部分以辅音开头,或其他),您可以通过修改正则表达式来解决。

      【讨论】:

        【解决方案4】:

        我猜您通常在寻找从字符向量元素开始到第一个下划线的子字符串。你只会找到一个匹配项(只有一个子字符串开始元素)所以sub 是去的地方,要么匹配所需的字符串(查看字符串的开头^ 捕获零个或多个字符不是下划线([^_]*),后跟一个下划线,可能还有其他字符_.*)

        re1 = "^([^_]*)_.*"
        sub(re1, "\\1", x)
        

        或删除第一个下划线后的内容(下划线 _ 后跟零个或多个任何其他字符 .*

        re2 = "_.*"
        sub(re2, "", x)
        

        通过一些测试

        x = c("a_b", "a_", "_b", "a", "a_b_c", "", NA)
        sub(re1, "\\1", x)
        ## [1] "a" "a" ""  "a" "a" ""  NA 
        sub(re2, "", x)
        ## [1] "a" "a" ""  "a" "a" ""  NA 
        

        strsplit 解决方案在其中一些问题上失败了。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2022-01-17
          • 2019-04-08
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多