【问题标题】:Remove string after first number using r regex使用 r 正则表达式删除第一个数字后的字符串
【发布时间】:2019-06-15 16:38:23
【问题描述】:

如何删除字符串第一个数字之后的所有内容?

x <- c("Hubert 208 apt 1", "Mass Av 300, block 3")

this question之后,我成功删除了第一个数字之前的所有内容,包括第一个数字:

gsub( "^\\D*\\d+", "", x )
[1] " apt 1"    ", block 3"

但所需的输出如下所示:

[1] "Hubert 208"     "Mass Av 300"
> 

【问题讨论】:

    标签: r regex


    【解决方案1】:

    在 OP 的当前代码中,稍作更改即可使其工作,即将匹配模式捕获为一个组 ((...)) 并替换为反向引用 (\\1)

    sub("^(\\D*\\d+).*", "\\1", x)
    #[1] "Hubert 208"  "Mass Av 300"
    

    这里,来自 OP 的模式意味着 ("^\\D*\\d+") - 从字符串的开头 (^) 开始的零个或多个非数字字符 (\\D*),后跟一个或多个数字 (@ 987654327@),这被捕获为一个带括号的组 ((...))。

    此外,我们只需要sub 而不是gsub(全局替换),因为我们只需要匹配一个实例(从一开始)

    【讨论】:

    • 工作,谢谢。请您解释一下符号的含义吗?
    • @NBK 我添加了一些描述。希望对你有帮助
    【解决方案2】:

    这个表达式可能稍微安全一些,

    ^\s*(.+?)([0-9]+)
    

    Demo

    【讨论】:

      【解决方案3】:

      替代替换的另一个选项是获取您的表达式并使用匹配来代替。

      您的模式将匹配直到第一个数字之后,从字符串的开头开始匹配 ^ 0+ 次而不是数字 \D* 后跟 1+ 次数字 \d+

      ^\\D*\\d+
      

      Regex demo

      如果您将 sub 与 perl=TRUE 一起使用,您可以使用 \K 来忘记匹配的内容。

      那么你可以使用:

      ^\\D*\\d+\\K.*
      

      Regex demo

      在替换中使用空字符串。

      sub("^\\D*\\d+\\K.*", "", x, perl=TRUE)
      

      【讨论】:

        【解决方案4】:

        您还可以将当前的正则表达式模式与stringr::str_extract 一起使用:

        x <- c("Hubert 208 apt 1", "Mass Av 300, block 3")
        stringr::str_extract(x, "^\\D*\\d+")
        
        [1] "Hubert 208"  "Mass Av 300"
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-09-08
          • 1970-01-01
          • 2016-11-18
          • 2013-04-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多