从包含特殊字符的字符串中提取年份编号

Pat*_*ada 4 regex r

从以下字符串中仅提取数字2007的好方法是什么:

some_string <- "1_2_start_2007_3_end"
Run Code Online (Sandbox Code Playgroud)

在我的情况下检测年份数的模式是:

  • 4位数
  • 被...围绕 "_"

我是使用正则表达式的新手.我尝试了以下方法:

 regexp <- "_+[0-9]+_"
 names <- str_extract(files, regexp)
Run Code Online (Sandbox Code Playgroud)

但这并没有考虑到总有4位数字并输出下划线.

Wik*_*żew 5

您也可以使用一个sub选项:

some_string <- "1_2_start_2007_3_end"
sub(".*_(\\d{4})_.*", "\\1", some_string)
Run Code Online (Sandbox Code Playgroud)

请参阅正则表达式演示

细节

  • .* - 任何0+字符,尽可能多
  • _- 一个_
  • (\\d{4})- 第1组(通过\1替换模式引用):4位数
  • _.*- a _然后任何0+字符到字符串的结尾.

注意:akrun str_extract(some_string, "(?<=_)\\d{4}")将提取最左边的出现,我sub(".*_(\\d{4})_.*", "\\1", some_string)将提取最右边出现的4位数子串_.对于我的返回最左边的解决方案,使用第一个的懒惰量词.:sub(".*?_(\\d{4})_.*", "\\1", some_string).

R测试:

some_string <- "1_2018_start_2007_3_end"
sub(".*?_(\\d{4})_.*", "\\1", some_string) # leftmost
## -> 2018
sub(".*_(\\d{4})_.*", "\\1", some_string) # rightmost
## -> 2007
Run Code Online (Sandbox Code Playgroud)