我想从字符串中提取年份.这总是在"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)
在这种情况下,捕获组无关紧要.该函数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 .
.
或者,您可以使用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)