[R正则表达式回顾后

问题描述:

我已经填写以下格式的字符串数组:<year1><year2><id1><id2>[R正则表达式回顾后

向量的第一项是这样的:

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可以不处理lookahead和lookbehinds?

+3

看看'regex'的帮助页面。 'perl = TRUE'支持lookbehind。所以'regexp(“^ \\ d {4} | \\ d {1}(? mpiktas 2012-01-12 12:02:50

+0

感谢您的提示!我知道这个正则表达式不会全部捕获,我只是稍微试验一下 - 当我一直得到一个“无效的正则表达式”的信息时,它就会陷入瘫痪。 – 2012-01-12 14:46:28

+0

使用gsubfn中的'strapply'这个正则表达式可以工作,并且不需要前瞻或后顾:'L 2012-01-12 15:34:07

由于这是固定的格式,为什么不使用SUBSTR? year1使用substr(s,1,4)id1使用substr(s,9,9)萃取,id2作为as.numeric(substr(s,10,13))萃取。在最后的情况下,我用as.numeric摆脱零。

+1

感谢mpiktas,应该想到这一点。但我仍然好奇为什么lookbehind不起作用... – 2012-01-12 12:04:07

+0

看到我的其他答案:) – mpiktas 2012-01-12 12:07:52

您将需要使用gregexprbase包。此作品:

> 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

您可以使用子。

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

感谢您的建议! – 2012-01-15 20:44:54