在布尔搜索字符串

时间:2018-01-26 17:15:53

标签: r regex stringr

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

具体来说,在字符串" 4.25亿韩元"中,我想提取"赢得"首先,然后" n"如果"赢了"不会出现。

我希望结果是"赢得"对于以下内容:

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

请注意,在我的正则表达式中赢得之前指定空格是不够的,因为我的数据存在其他限制(可能不一定在"百万"和#34;赢得"之间)。理想情况下,我想使用正则表达式,而不是if-else子句,因为性能方面的考虑。

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:1)

如果您只想扩展已有的代码:

 na.omit(str_extract("420 million won", c("won", "n")))[1]