我想从字符串中提取年份。这总是在“X”之后和“之前”。然后是一串其他字符。
使用stringr的str_extract我正在尝试以下方法:
year = str_extract(string = 'X2015.XML.Outgoing.pounds..millions.'
, pattern = 'X(\\d{4})\\.')
我认为方括号会定义捕获组,返回2015
,但实际上我得到完整匹配X2015.
我这样做是否正确?为什么我不修剪“X”和“。”?
答案 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]