【问题标题】:R Sub function: pull everything after second numberR子功能:拉第二个数字后的所有内容
【发布时间】:2021-06-24 14:49:58
【问题描述】:

试图弄清楚如何使用 R 中的 sub 函数拉出第二个数字之后的所有内容。我了解惰性和贪婪匹配的基础知识,但是我如何更进一步并拉出第二个数字之后的所有内容?

str <- 'john02imga-04'

#lazy:拉取第一个数字之后的所有内容

sub(".*?[0-9]", "", str)

#output: "2imga-04

#greedy:拉取最后一个数字之后的所有内容

sub(".*[0-9]", "", str)

#输出:“”

#desired 输出:“imga-04”

【问题讨论】:

  • @WiktorStribiżew,它有,我只是不能接受这两种解决方案作为答案:(
  • 我明白了,所以另一个答案最适合你。

标签: r regex


【解决方案1】:

你可以使用

sub("\\D*[0-9]+", "", str)
## Or,
## sub("\\D*\\d+", "", str)
## => [1] "imga-04"

请参阅regex demo。另请参阅the R demo online

sub 将查找并替换第一次出现的

  • \D* (=[^0-9]) - 任何零个或多个非数字字符
  • [0-9]+ (=\d+) - 一位或多位数字。

替代方法

匹配一个或多个字母,-,字符串末尾的一个或多个数字:

> regmatches(str, regexpr("[[:alpha:]]+-\\d+$", str))
[1] "imga-04"

> library(stringr)
> str_extract(str, "\\p{L}+-\\d+$")
[1] "imga-04"

【讨论】:

    【解决方案2】:

    您可以在第二部分使用捕获组并在替换中使用它

    ^\D+\d+(\D+\d+)
    
    • ^ 字符串开始
    • \D+\d+ 匹配 1+ 个非数字,然后匹配 1+ 个数字
    • (\D+\d+)捕获组1,匹配1+非数字并匹配1+数字

    Regex demo | R demo

    str <- 'john02imga-04'
    sub("^\\D+\\d+(\\D+\\d+)", "\\1", str)
    

    输出

    [1] "imga-04"
    

    如果要删除第二个数字之后的所有内容:

    ^\D+\d+(\D+\d+).*
    

    Regex demo


    作为替代方法,仅使用perl=T 来使用 PCRE 和\K 来清除匹配缓冲区:

    str <- 'john02imga-04'
    regmatches(str, regexpr("^\\D+\\d+\\K\\D+\\d+", str, perl = T))
    

    输出

    [1] "imga-04"
    

    查看R demo

    【讨论】:

    • 感谢您的回复和分享正则表达式演示。我一定会努力学习这个
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-27
    • 1970-01-01
    • 1970-01-01
    • 2012-11-28
    相关资源
    最近更新 更多