stringr str_extract 捕获组捕获一切

stringr str_extract capture group capturing everything

我想从字符串中提取年份。这总是在 'X' 之后和“.”之前。然后是一串其他字符。

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

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

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

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

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

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

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

此正则表达式匹配前面为 X、后面为 . 的四个连续数字。

或者,您可以使用 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"

我相信最惯用的方法是使用 str_match:

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

其中 returns 完整匹配后跟捕获组:

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

因此,以下内容可以解决问题:

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