【问题标题】:R sub/gsub replacing first occurence of match [duplicate]R sub / gsub替换匹配的第一次出现[重复]
【发布时间】:2019-10-23 17:12:20
【问题描述】:

在 R 中,我需要从以下字符串中提取“八”:

this_str <- " Eight years blah blah 50 blah blah, two years blah blah blah."

这是我使用 gsub 的尝试:

gsub("^.*\\s([^ ]*)\\s(years|months)\\s.*", "\\1", this_str)

但这会返回“two”,它对应于 gsub() 中指示的模式的第二次出现。在其他帖子中,据说 sub() 应该返回第一个匹配项。但是当我使用 sub() 时,它也会给出“两个”。

【问题讨论】:

    标签: r regex gsub


    【解决方案1】:

    sub 进行一次替换,而gsub 进行多次替换。相反,问题是开头的.*贪婪:它上升到“两个”(即,包括除最后一个匹配之外的所有匹配项)。相反,我们想要 惰性(参见 here)并尽可能少地匹配:

    sub("^.*?\\s([^ ]*)\\s(years|months)\\s.*", "\\1", this_str)
    # [1] "Eight"
    

    【讨论】:

      【解决方案2】:

      在这里,我们可能会使用传递可选空格的表达式,以防万一,例如:

      (\s+)?(.+?)(\s+)?(years?|months?).*
      

      我们想要的输出在第二个捕获组中:

      (.+?)
      

      我们的代码看起来像

      gsub("(\\s+)?(.+?)(\\s+)?(years?|months?).*", "\\2", this_str)
      

      Demo

      正则表达式

      如果不需要此表达式并且您希望对其进行修改,请访问此链接regex101.com

      正则表达式电路

      jex.im 可视化正则表达式:

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-10-10
        • 1970-01-01
        • 2012-02-27
        • 2016-09-08
        • 1970-01-01
        • 1970-01-01
        • 2016-03-20
        • 1970-01-01
        相关资源
        最近更新 更多