我尝试从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
无法使用Lookbehind
和Lookahead
表达式,所以我很遗憾地回到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; 答案 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) y
或x + 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"