【问题标题】:stringr str_extract capture group capturing everythingstringr str_extract 捕获组捕获所有内容
【发布时间】:2017-10-17 10:14:05
【问题描述】:

我希望从字符串中提取年份。这总是出现在“X”之后和“。”之前。然后是一串其他字符。

使用stringrstr_extract 我正在尝试以下操作:

year = str_extract(string = 'X2015.XML.Outgoing.pounds..millions.'
                 , pattern = 'X(\\d{4})\\.')

我以为括号会定义捕获组,返回2015,但实际上我得到了完整的匹配X2015.

我这样做正确吗?为什么我不修剪“X”和“.”?

【问题讨论】:

    标签: r regex stringr


    【解决方案1】:

    在这种情况下,捕获组无关紧要。函数str_extract 将返回整个匹配项,包括捕获组之前和之后的字符。

    您必须改为使用后向和前瞻。它们的长度为零。

    library(stringr)
    str_extract(string = 'X2015.XML.Outgoing.pounds..millions.',
                pattern = '(?<=X)\\d{4}(?=\\.)')
    # [1] "2015"
    

    这个正则表达式匹配四个连续的数字,前面是 X,后面是 .

    【讨论】:

      【解决方案2】:

      或者,您可以使用gsub

      string = 'X2015.XML.Outgoing.pounds..millions.'
      
      gsub("X(\\d{4})\\..*", "\\1", string)
      # [1] "2015"
      

      str_replace 来自stringr

      library(stringr)
      str_replace(string, "X(\\d{4})\\..*", "\\1")
      # [1] "2015"
      

      【讨论】:

        【解决方案3】:

        我相信最惯用的方式是使用str_match

        str_match(string = 'X2015.XML.Outgoing.pounds..millions.',
                  pattern = 'X(\\d{4})\\.')
        

        返回完整匹配,后跟捕获组:

             [,1]     [,2]  
        [1,] "X2015." "2015"
        

        因此,以下方法可以解决问题:

        str_match(string = 'X2015.XML.Outgoing.pounds..millions.',
                  pattern = 'X(\\d{4})\\.')[2]
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2015-06-13
          • 1970-01-01
          • 1970-01-01
          • 2014-11-23
          • 2014-06-26
          • 1970-01-01
          • 2016-06-08
          相关资源
          最近更新 更多