R正则表达式Lookbehind

时间:2012-01-12 11:41:31

标签: regex r package text-mining

我的矢量中填充了以下格式的字符串:<year1><year2><id1><id2>

向量的第一个条目如下所示:

199719982001
199719982002
199719982003
199719982003

对于我们的第一个条目:year1 = 1997,year2 = 1998,id1 = 2,id2 = 001.

我想编写一个正则表达式,它将year1,id1和id2的数字拉出非零。所以对于第一个条目,正则表达式应输出:199721。

我尝试过使用stringr包,并创建了以下正则表达式:

"^\\d{4}|\\d{1}(?<=\\d{3}$)"

取出year1和id1,但是当使用lookbehind时,我得到一个“无效的正则表达式”错误。这对我来说有点令人费解,R不能处理前瞻和外观吗?

3 个答案:

答案 0 :(得分:9)

您需要使用gregexpr包中的base。这有效:

> s <- "199719982001"
> gregexpr("^\\d{4}|\\d{1}(?<=\\d{3}$)",s,perl=TRUE)
[[1]]
[1]  1 12
attr(,"match.length")
[1] 4 1
attr(,"useBytes")
[1] TRUE

请注意perl=TRUE设置。有关详细信息,请查看?regex

从输出结果来看,你的正则表达式不会捕获id1

答案 1 :(得分:8)

由于这是固定格式,为什么不使用substr? year1使用substr(s,1,4)提取,id1使用substr(s,9,9)提取,id2提取为as.numeric(substr(s,10,13))。在最后一种情况下,我使用as.numeric来消除零。

答案 2 :(得分:1)

您可以使用sub。

sub("^(.{4}).{4}(.{1}).*([1-9]{1,3})$","\\1\\2\\3",s)