【问题标题】:Regex to remove all numbers before a specific character (working in R)正则表达式删除特定字符之前的所有数字(在 R 中工作)
【发布时间】:2019-08-30 19:39:06
【问题描述】:

我正在寻找正则表达式来删除第一次出现下划线 (_) 之前的所有数字。

这是我要修改的字符串示例 -

"123-abc-123_abc-123_abc_123_abc"

这是想要的结果 -

"-abc-_abc-123_abc_123_abc"

我已经尝试了很多东西。积极的前瞻似乎会奏效。例如我试过这个 -

str_replace_all("123-abc-123_abc-123_abc_123_abc", "[0-9]*(?=.*_)", "")

但这匹配所有前面有下划线的数字,而不仅仅是第一个下划线实例之前的数字。

【问题讨论】:

    标签: r regex


    【解决方案1】:

    你可以使用

    x <- "123-abc-123_abc-123_abc_123_abc"
    gsub("\\G([^_\\d]*)\\d", "\\1", x, perl=TRUE)
    

    regex demo。正则表达式匹配

    • \G - 字符串的开头或上一个匹配的结尾
    • ([^_\d]*) - 第 1 组(其值由替换模式中的 \1 占位符引用):除数字或 _ 之外的任何 0+ 字符
    • \d - 一个数字。

    或者,使用

    library(stringr)
    x <- "123-abc-123_abc-123_abc_123_abc"
    str_replace(x, "\\d[^_]*", function(m) { gsub("\\d", "", m) })
    [1] "-abc-_abc-123_abc_123_abc"
    

    \d[^_]* 模式将匹配一个数字和除 _ 之外的所有 0 或多个字符,str_replace 将只处理第一次出现,将匹配替换为其副本,其中所有数字都被删除function(m) { gsub("\\d", "", m) }.

    R demo online

    【讨论】:

    • 没有意识到函数可以在str_replace的replacement参数中使用。感谢您提供 stringr 和 base r 解决方案。
    • @bbspring 这两种解决方案的可读性和速度可能不同,第一种应该更快(没有测试,但通常非回调纯正则表达式解决方案更快),而第二种对程序员来说更简单眼睛。
    【解决方案2】:

    另一种选择是在第 1 组中捕获从第一个下划线到字符串末尾的匹配或匹配 1+ 个数字。

    (_.*$)|\d+
    

    Regex demo | R demo

    在替换中使用第一个捕获组。

    s <- "123-abc-123_abc-123_abc_123_abc"
    gsub("(_.*$)|\\d+", "\\1", s)
    

    结果

    [1] "-abc-_abc-123_abc_123_abc"
    

    【讨论】:

    • 酷。这个非 perl 解决方案对我的目的也很有用。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-07-30
    • 2014-01-10
    • 2011-03-19
    • 2020-02-16
    • 2011-09-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多