stringr str_extract捕获组捕获所有内容

Use*_*716 7 regex r stringr

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

使用stringr的str_extract我正在尝试以下方法:

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

我认为括号会定义捕获组,返回stringr,但实际上我得到完全匹配str_extract

我这样做了吗?为什么我不修剪"X"和"."?

Sam*_*yer 10

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

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

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

     [,1]     [,2]  
[1,] "X2015." "2015"
Run Code Online (Sandbox Code Playgroud)

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

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


Sve*_*ein 9

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

你必须使用lookbehind和lookahead.它们的长度为零.

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

此正则表达式匹配四个连续数字,前面带有a X,后跟a ..


avi*_*seR 5

或者,您可以使用gsub

string = 'X2015.XML.Outgoing.pounds..millions.'

gsub("X(\\d{4})\\..*", "\\1", string)
# [1] "2015"
Run Code Online (Sandbox Code Playgroud)

str_replace来自stringr

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