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

时间:2018-02-15 08:21:04

标签: r regex

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

some_string <- "1_2_start_2007_3_end"

在我的案例中检测年份数的模式是:

  • 4位数
  • 被“_”包围

我很擅长使用正则表达式。我尝试了以下方法:

 regexp <- "_+[0-9]+_"
 names <- str_extract(files, regexp)

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

4 个答案:

答案 0 :(得分:5)

您也可以使用sub选项:

some_string <- "1_2_start_2007_3_end"
sub(".*_(\\d{4})_.*", "\\1", some_string)

请参阅regex demo

<强>详情

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

注意:akrun的str_extract(some_string, "(?<=_)\\d{4}")会提取最左边的事件,我的sub(".*_(\\d{4})_.*", "\\1", some_string)会提取最右边的事件用_括起来的4位数字符串。对于我的返回最左边的解决方案,请使用第一个.sub(".*?_(\\d{4})_.*", "\\1", some_string)的惰性量词。

R test

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

答案 1 :(得分:4)

我们可以使用正则表达式lookbehind指定_并提取后面的4位数

library(stringr)
str_extract(some_string, "(?<=_)\\d{4}")
#[1] "2007"

如果模式在4位数之前和之后都显示-,那么也可以使用正则表达式前瞻

str_extract(some_string, "(?<=_)\\d{4}(?=_)")
#[1] "2007"

答案 2 :(得分:2)

只是为了得到一个非正则表达式的方法,我们在_上拆分并转换为数字。所有非数字都将被强制转换为NA,因此我们使用!is.na来消除它们。然后我们使用nchar计算字符数,然后用4来计算字符。

i1 <- as.numeric(strsplit(some_string, '_')[[1]])
i1 <- i1[!is.na(i1)]

i1[nchar(i1) == 4]
#[1] 2007

答案 3 :(得分:0)

这是我能想到的最快的正则表达式:

\S.*_(\d{4})_\S.*

这意味着,

  • 任意数量的非空格字符,
  • 然后_
  • 后跟四位数(d {4})
  • 以上四位数是您使用()
  • 捕获的年份
  • 另一个_
  • 任何其他乱码非空格字符串

因为,你提到你是新手,请在https://regex101.com/测试这个和所有其他答案,非常好学习正则表达式,它深入解释你的正则表达式实际上在做什么。

如果您只关心(年),那么在正则表达式之下就足够了:

_(\d{4})_