我试图从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})的意思是“不以数字为先导的匹配表达式”。[0-9]{2}\\.[0-9]{2}\\.[0-9]{2}\\.[0-9]{2}-[0-9]{1}代表我所寻求的表达式(?![0-9]{1})的意思是“匹配表达式,后面没有数字”。发布于 2014-10-26 13:55:37
正如@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"发布于 2014-10-26 13:58:05
实际上,您不需要使用这种方法进行前瞻性或后置。只需插入要提取的部分:
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。
注意:,这个问题似乎是说,非数字必须直接出现在字符串之前和之后,但是基于已经消失的注释,似乎真正想要的是字符串要么在开始,要么在一个非数字之后,必须在末尾或者由一个非数字折叠。答案已被如此修改。
https://stackoverflow.com/questions/26573611
复制相似问题