r regex Lookbehind Lookahead问题

时间:2014-10-26 13:41:41

标签: regex r extract stringr

我尝试从R中的文本中提取44.11.36.00-1(确切地说,nn.nn.nn.nn-n,其中n代表0-9中的任何数字)等段落。

我想提取段落,如果他们是"坚持"到非数字标记:

    44.11.36.00-1中提取的
  • nsfghstighsl44.11.36.00-1vsdfgh即可
  • 44.11.36.00-1中提取的
  • fa0044.11.36.00-1000不是

我已经读过str_extract_all无法使用LookbehindLookahead表达式,所以我很遗憾地回到grep,但无法处理它:

> pattern1 <- "(?<![0-9]{1})[0-9]{2}\\.[0-9]{2}\\.[0-9]{2}\\.[0-9]{2}-[0-9]{1}(?![0-9]{1})"
> grep(pattern1, "dyj44.11.36.00-1aregjspotgji 44113600-1 agdtklj441136001 ", perl=TRUE, value = TRUE)

[1] "dyj44.11.36.00-1aregjspotgji 44113600-1 agdtklj441136001 "

这不是我预期的结果。

我想:

  • (?<![0-9]{1})表示&#34;匹配表达式,前面没有数字&#34;
  • [0-9]{2}\\.[0-9]{2}\\.[0-9]{2}\\.[0-9]{2}-[0-9]{1}代表我寻求的表达
  • (?![0-9]{1})表示&#34;匹配表达式,后面没有数字&#34;

2 个答案:

答案 0 :(得分:3)

这种方法实际上并不需要前瞻或后视。只需将要提取的部分括起来:

library(gsubfn)
x <- c("nsfghstighsl44.11.36.00-1vsdfgh", "fa0044.11.36.00-1000") # test data

pat <- "(^|\\D)(\\d{2}[.]\\d{2}[.]\\d{2}[.]\\d{2}-\\d)(\\D|$)"
strapply(x, pat, ~ ..2, simplify = c)

## "44.11.36.00-1"

请注意,~ ..2是函数function(...) ..2的缩写,这意味着将匹配项捕获到正则表达式中的第二个带括号的部分。我们也可以写function(x, y, z) yx + y + z ~ y

注意:问题似乎是说非字母必须直接来自字符串之前和之后,但根据已消失的评论,似乎真正想要的是字符串是无论是在开头还是在非数字之后,必须在最后或者在非数字之后。答案已经过如此修改。

答案 1 :(得分:2)

AS @Roland在评论中说,您需要使用regmatches代替grep

> s <- "nsfghstighsl44.11.36.00-1vsdfgh"
> m <- gregexpr("(?<![0-9]{1})[0-9]{2}\\.[0-9]{2}\\.[0-9]{2}\\.[0-9]{2}-[0-9]{1}(?![0-9]{1})", s, perl=TRUE)
> regmatches(s, m)
[1] "44.11.36.00-1"

减少的,

> x <- c('nsfghstighsl44.11.36.00-1vsdfgh', 'fa0044.11.36.00-1000')
> m <- gregexpr("(?<!\\d)\\d{2}\\.\\d{2}\\.\\d{2}\\.\\d{2}-\\d(?!\\d)", x, perl=TRUE)
> regmatches(x, m)
[1] "44.11.36.00-1"