2017-09-07 153 views
2

有人能解釋爲什麼"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

它不會被替換,因爲它與您的表達不匹配,就這些了,請參閱此演示:https://ideone.com/R03jGK – Jan

+1

從'?gsub'的Value部分的第4段:*字符元素未被替代的向量x將不會被返回*。 – lmo

+0

@Jan @Imo所以它意味着'gsub'也會返回一個長度爲5的向量。如果沒有匹配,原始元素將被返回,對吧? – DXC

回答

1

gsub函數採用正則表達式(如果使用fixed=TRUE,則爲純字符串)並嘗試在輸入字符向量中查找匹配項。如果找到匹配,則用替換字符串/模式替換該匹配。如果未找到匹配項,則當前字符(字符串)將保持不變。

既然您想從字符向量的每個元素中獲得唯一的提名值,您需要提取他們,而不是替換匹配項。

你可以依靠stringrstr_extract

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

[0-9]+(?=\\s*nomination)模式發現1個或多個數字,但只有那些注視着0+空格和nomination字符序列(這些空格和「提名「這個單詞被排除在匹配之外,因爲這是一個非消耗的積極向前構造((?=...))構造中的模式,即不將匹配文本放入匹配值中。

相關問題