stringr str_extract捕获组捕获所有内容

时间:2017-10-17 10:14:05

标签: r regex

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

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

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

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

我这样做是否正确?为什么我不修剪“X”和“。”?

3 个答案:

答案 0 :(得分:5)

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

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

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

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

答案 1 :(得分: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"

答案 2 :(得分:0)

我认为最惯用的方法是使用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]