我有一個這樣的字串:
text <- "This is some text::stuff. Look, there's some::more. And here::is some more."
我想提取雙冒號之前的單詞。為此,我使用gregexpr在雙冒號之前立即匹配字母數字:
m <- gregexpr("[[:alnum:]]*::", text)
然后,我呼叫regmatches拉出這個文本,unlist結果到一個向量,最后用 . 去掉雙冒號gsub。
gsub("::", "", unlist(regmatches(text, m)))
#[1] "text" "some" "here"
這是期望的結果,但依賴于四個函式呼叫。有沒有更有效的方法來達到同樣的結果?
uj5u.com熱心網友回復:
您可以使用前瞻并str_extract_all一次性完成所有操作:
library(stringr)
str_extract_all(text, "\\w (?=::)")[[1]]
[1] "text" "some" "here"
uj5u.com熱心網友回復:
您可以使用
m <- gregexpr("[[:alnum:]] (?=::)", text, perl=TRUE)
請參閱正則運算式演示。在這里,[[:alnum:]] (?=::)匹配一個或多個字母或數字,然后檢查它們是否緊跟兩個冒號而不消耗冒號,因為這(?=...)是一個不消耗的前瞻結構。
請注意,perl=TRUE這里的引數是強制性的,因為默認的 TRE 正則運算式引擎不允許使用環視。perl=TRUE啟用 PCRE 正則運算式引擎,它允許后視和前瞻。
查看R 演示:
text <- "This is some text::stuff. Look, there's some::more. And here::is some more."
m <- gregexpr("[[:alnum:]] (?=::)", text, perl=TRUE)
unlist(regmatches(text, m))
## => [1] "text" "some" "here"
uj5u.com熱心網友回復:
您還可以使用捕獲組而不是環顧四周,并重復[[:alnum:]] 1 次或多次以防止匹配空字串
library(stringr)
text <- "This is some text::stuff. Look, there's some::more. And here::is some more."
str_match_all(text, "([[:alnum:]] )::")[[1]][,2]
輸出
[1] "text" "some" "here"
查看R 演示
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/457092.html
