我试图从以下字符串中提取 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"