有人可以解释为什么可以根据下面给出的正则表达式选择"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 "
以及为什么似乎没有替代。
答案 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;字不包括在内匹配,因为这是一个非消费的积极前瞻((?=...)
)构造内的模式,即不将匹配的文本放入匹配值。)