我希望能够控制我从搜索字符串中提取的元素的层次结构。
具体来说,在字符串“ 4.25亿韩元”中,我想先提取“ won”,但是如果没有出现“ won”,则要提取“ n”。
我希望以下结果是“获胜”:
stringr::str_extract("425 million won", "won|n")
请注意,由于我的数据中的其他限制,在正则表达式中指定赢之前的空格是不够的(“百万”和“赢”之间不一定有空格)。理想情况下,出于性能考虑,我想使用regex而不是if-else子句来做到这一点。
最佳答案
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)
匹配won
或n