Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 从R中的字符串中提取数字模式_Regex_R_Gsub - Fatal编程技术网

Regex 从R中的字符串中提取数字模式

Regex 从R中的字符串中提取数字模式,regex,r,gsub,Regex,R,Gsub,我对正则表达式还比较陌生,现在正陷入死胡同。我有一个数据框,其列如下所示: year1 GMM14_2000_NGVA GMM14_2001_NGVA GMM14_2002_NGVA ... GMM14_2014_NGVA "(?:_)\d{4}(?:_)" 我试图在字符串的中间提取年份(20002001等)。这是到目前为止我的代码 gsub("[^0-9]","",year1)) 它返回数字,但也返回作为字符串一部分的14: 142000 142001 关于如何从模式中排除14,或者如

我对正则表达式还比较陌生,现在正陷入死胡同。我有一个数据框,其列如下所示:

year1
GMM14_2000_NGVA
GMM14_2001_NGVA
GMM14_2002_NGVA
...
GMM14_2014_NGVA
"(?:_)\d{4}(?:_)"
我试图在字符串的中间提取年份(20002001等)。这是到目前为止我的代码

gsub("[^0-9]","",year1))
它返回数字,但也返回作为字符串一部分的14:

142000
142001
关于如何从模式中排除14,或者如何更有效地提取年份信息,有什么想法吗


谢谢

使用以下
gsub

s  = "GMM14_2002_NGVA"
gsub("^[^_]*_|_[^_]*$", "", s)

正则表达式细分:

匹配

  • ^[^]*.
    -0个或更多字符,而不是字符串开头的
  • |
    -或
  • \u[^\ u]*$
    -a
    \u
    和字符串末尾0个或更多字符,而不是
    \u
并移除它们

作为替代方案

library(stringr)
str_extract(s,"(?<=_)\\d{4}(?=_)")
库(stringr)

str_extract(s),(?使用
stringi
package,以下是一种方法。假设年份为4位数字。由于您指定了数字,这非常简单

library(stringi)

x <- c("GMM14_2000_NGVA", "GMM14_2001_NGVA")

stri_extract_last(x, regex = "\\d{4}")
#[1] "2000" "2001"

base-R中的另一个选项是使用@jazzurro的数据
strsplit

x <- c("GMM14_2000_NGVA", "GMM14_2001_NGVA")

vapply(strsplit(x, '_'), function(x) x[2], character(1))
[1] "2000" "2001"
x您可以使用sub

sub(".*_(\\d{4})_.*", "\\1", x)

这将提取起始分隔符和结束分隔符之间的所有字符。此处起始分隔符和结束分隔符为下划线

语法:

extract_a(start, end, string)

我从未使用过R,但对regexps有着丰富的经验

惯用的正确方法是使用匹配

对于R,应为:

使用regmatches获取与正则表达式匹配的实际子字符串 作为第一个参数,传递与传递相同的输入 作为第二个参数,传递向量 由regexpr或gregexpr返回。如果从regexpr传递向量 然后,regmatches返回一个包含所有 匹配。如果不匹配,则此向量可能比输入向量短 在某些元素中找到匹配项。如果从 regexpr然后regmatches返回一个具有相同数量 元素作为输入向量。每个元素都是具有 输入向量中对应元素的所有匹配项,或 如果元素没有匹配项,则为NULL


很抱歉,没有机会在R中测试所有这一切。

请注意,gsub中的正则表达式匹配每个非数字的字符,并将其从输入中删除。这就是为什么结果中保留了输入中的所有数字。此正则表达式存在一个潜在问题:因为它不考虑上下文,所以任何最后或前4位的序列都将是extracted.@Stribizev当然可以。看到示例数据中的模式,我决定选择这种方式。如果还有其他模式,这不是办法。感谢您留下评论。:)您也可以使用直接函数
stri\u extract\u last\u regex(x,“\\d+”)
。应该更快,因为它避免了一些错误checks@RichardScriven很长时间了。是的,我同意你的看法!非常感谢你留下这条评论。
extract_a(start, end, string)
>x <- c("abc", "def", "cba a", "aa")
> m <- regexpr("a+", x, perl=TRUE)
> regmatches(x, m)
[1]  "a"  "a"  "aa"
m <- regexpr("\d{4}", year1, perl=TRUE)
regmatches(year1, m)
"(?:_)\d{4}(?:_)"