正则表达式:"。* \\ s([0-9] +)\\ snomination。* $"

时间:2017-09-07 17:55:13

标签: r regex

有人可以解释为什么可以根据下面给出的正则表达式选择"Won 1 Oscar."

awards <- c("Won 1 Oscar.",
"Won 1 Oscar. Another 9 wins & 24 nominations.",
"1 win and 2 nominations.",
"2 wins & 3 nominations.",
"Nominated for 2 Golden Globes. 1 more win & 2 nominations.",
"4 wins & 1 nomination.")

sub(".*\\s([0-9]+)\\snomination.*$", "\\1", awards)

我只能得到模式"abcd (any number 0 -9 ) nominationabcd"。匹配模式后,数字将替换整个字符串。匹配的"Won 1 Oscar"来自第二个元素。我感到困惑的是,nomination.*之后没有"Won 1 "以及为什么似乎没有替代。

1 个答案:

答案 0 :(得分:1)

gsub函数接受正则表达式(如果使用fixed=TRUE则使用纯字符串)并尝试在输入字符向量中查找匹配项。如果找到匹配项,则此替换将替换为替换字符串/模式。如果未找到匹配项,则返回当前字符(字符串)不变。

由于你想从角色向量的每个元素中获得唯一的提名值,你需要提取它们,而不是替换匹配。

您可以依赖 stringr str_extract

> library(stringr)
> str_extract(awards, "[0-9]+(?=\\s*nomination)")
[1] NA   "24" "2"  "3"  "2"  "1" 

[0-9]+(?=\\s*nomination)模式找到1个或多个数字,但只有那些跟随0 +空格和nomination字符序列的数字(这些空格和&#34;提名&#34;字不包括在内匹配,因为这是一个非消费的积极前瞻((?=...))构造内的模式,即不将匹配的文本放入匹配值。)