从以下字符串中仅提取数字2007的好方法是什么:
some_string <- "1_2_start_2007_3_end"
在我的案例中检测年份数的模式是:
我很擅长使用正则表达式。我尝试了以下方法:
regexp <- "_+[0-9]+_"
names <- str_extract(files, regexp)
但这并没有考虑到总有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)
的惰性量词。
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.*
这意味着,
因为,你提到你是新手,请在https://regex101.com/测试这个和所有其他答案,非常好学习正则表达式,它深入解释你的正则表达式实际上在做什么。
如果您只关心(年),那么在正则表达式之下就足够了:
_(\d{4})_