r-提取子字符串匹配的正则



我试图从以下字符串中提取 22 chocolates

   SOMETEXT for 2 FFXX. Another 22 chocolates & 45 chamkila.

使用Regex \d+\s*(chocolates.|chocolate.)。我用过:

grep("\d+\s*(chocolates.|chocolate.)",s)

,但不给字符串22 chocolates。我如何提取与正则匹配的部分?

这是使用base r的sub的选项:

x <- "SOMETEXT for 2 FFXX. Another 22 chocolates & 45 chamkila."
sub(".*?(\d+ chocolates?).*", "\1", x)
22 chocolates

括号中的模式(\d+ chocolates?)是A capture 组,并且在sub上运行后可作为\1提供。

demo

编辑:

如您所见,如果sub找不到确切的匹配,它将返回输入字符串。这种行为通常是有道理的,因为在替换没有意义的情况下,您希望输入不会更改。

如果您需要找出模式是否匹配,则调用grep是一个选项:

grep(".*(\d+ chocolates?).*",x,value = FALSE)

您的原始模式不返回 22 chocolates,因为它是应在a 匹配函数中使用的模式,而 grep仅在字符向量中返回整个项目在任何地方都包含匹配。

另外,请注意,(chocolates.|chocolate.)交替组可以缩短为chocolates?.,因为唯一的区别是chocolate的复数案例,并且可以使用?量词来轻松实现它(= 1或0出现(。

> 。

匹配函数示例可以与stringr::str_extract(str_extract_all匹配所有出现(:

> library(stringr)
> x <- " SOMETEXT for 2 FFXX. Another 22 chocolates & 45 chamkila."
> p <- "\d+\s*chocolates?"
> str_extract(x, p)
[1] "22 chocolates"

或基础R regmatches/regexpr(或gregexpr提取多个出现(方法:

> library(stringr)
> x <- " SOMETEXT for 2 FFXX. Another 22 chocolates & 45 chamkila."
> p <- "\d+\s*chocolates?"
> regmatches(x, regexpr(p, x))
[1] "22 chocolates"

最新更新