我希望能够控制从搜索字符串中提取的元素的层次结构。
具体来说,在字符串" 4.25亿韩元"中,我想提取"赢得"首先,然后" n"如果"赢了"不会出现。
我希望结果是"赢得"对于以下内容:
stringr::str_extract("425 million won", "won|n")
请注意,在我的正则表达式中赢得之前指定空格是不够的,因为我的数据存在其他限制(可能不一定在"百万"和#34;赢得"之间)。理想情况下,我想使用正则表达式,而不是if-else子句,因为性能方面的考虑。
答案 0 :(得分:3)
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
答案 1 :(得分:1)
如果您只想扩展已有的代码:
na.omit(str_extract("420 million won", c("won", "n")))[1]