我希望能够控制我从搜索字符串中提取的元素的层次结构。

具体来说,在字符串“ 4.25亿韩元”中,我想先提取“ won”,但是如果没有出现“ won”,则要提取“ n”。

我希望以下结果是“获胜”:

stringr::str_extract("425 million won", "won|n")


请注意,由于我的数据中的其他限制,在正则表达式中指定赢之前的空格是不够的(“百万”和“赢”之间不一定有空格)。理想情况下,出于性能考虑,我想使用regex而不是if-else子句来做到这一点。

最佳答案

See code in use here

pattern <- "^(?:(?!won).)*\\K(?:won|n)"
s <- "425 million won"
m <- gregexpr(pattern,s,perl=TRUE)
regmatches(s,m)[[1]]


说明


^在行的开头声明位置
(?:(?!won).)* Tempered greedy token匹配任何字符,但won继续的情况除外
\K重置比赛的起点。最终比赛中将不再包含任何以前消耗的字符
(?:won|n)匹配wonn

08-20 00:39