【问题标题】:regex to get everything before first number正则表达式在第一个数字之前获取所有内容
【发布时间】:2018-01-04 02:33:36
【问题描述】:

我不知道如何让这个正则表达式工作。

我的样本数据向量如下所示:

claims40 1.1010101
clinical41 391.1
...

它遵循以下模式:

  • 一个名字,
  • 后跟不带空格的版本号,以及
  • 然后是其他各种号码。

我正在尝试在数据框中创建一个仅包含名称的新列,该名称可以是可变数量的字符。

所以新列应该是这样的:

claims
clinical
...

当我尝试使用表达式时:

^(.*?)\\d

在正则表达式中,我没有得到正确的字符匹配长度。

问题:什么是正确的正则表达式来捕获字符串中第一个数字之前的所有内容?

【问题讨论】:

    标签: r regex


    【解决方案1】:
    gsub("[^a-zA-Z]", "", c("claims40 1.1010101", "clinical41 391.1"))
    # [1] "claims"   "clinical"
    

    也是这个posix风格:

    gsub("[^[:alpha:]]", "", c("claims40 1.1010101", "clinical41 391.1"))
    # [1] "claims"   "clinical"
    

    【讨论】:

    • 谢谢!这工作得很好。我的代码有什么问题?当我尝试在 regex101 之类的工具中运行正则表达式时,它返回了正确的值。
    • 我不知道什么是regex101。如果你想了解更多关于 R 的正则表达式能力,请阅读帮助文档?"regular expression"
    • @user6079762 你是否明确地将第一组与你的表达相匹配?
    • 在模式的基础上,英文字母后面只有数字和其他字符,所以我们只提取英文字符。
    【解决方案2】:

    如果你特别想匹配到第一个数字,你也可以这样做

    gsub("^(.+?)(?=\\d).*", "\\1", c("claims40 1.1010101", "clinical41 391.1"), perl = TRUE)
    
    [1] "claims"   "clinical"
    

    【讨论】:

      【解决方案3】:

      还有来自stringrstr_extract

      stringr::str_extract(c("claims40 1.1010101", "clinical41 391.1"), "^[[:alpha:]]+")
      # [1] "claims"   "clinical"
      

      这会“提取”字母字符,而不是删除其他所有内容。

      【讨论】:

        猜你喜欢
        • 2017-11-15
        • 1970-01-01
        • 1970-01-01
        • 2011-08-24
        • 2021-02-10
        • 1970-01-01
        • 2019-01-10
        • 1970-01-01
        • 2018-12-11
        相关资源
        最近更新 更多