R中的正则表达式,只有事后才匹配子字符串

时间:2016-07-01 21:11:55

标签: regex r

my_string = "2011, this year I made 750,000 dollars"

是否有一种优雅的方法可以匹配上面字符串中的"2011""750,000"。我们的想法是在看起来像数字值时提取数值,例如\d+\d+[\.,]?\d*,具体取决于逗号之后是否存在逗号

我试过这个,但它与我想要的完全不符,我得到了“2011”,这是不好的

library(stringr)
str_match_all(fkin, "(\\d+[\\.,]?\\d*)

这是我的预期结果:

"2011" "750,000"

2 个答案:

答案 0 :(得分:1)

你可以这样做:

[0-9]+(?:[,.][0-9]+)*

非常优雅,我在镜子前试了一下。

答案 1 :(得分:1)

这是一个正则表达式纯基R 方法,用于提取整数或浮点值,这些值不是用连字符分隔的数字串的一部分:

> str <- "2011, this year I made 750,000 dollars and 750,000-589 here"
> regmatches(str, gregexpr('(?<!\\d-)\\b\\d+(?:[,.]\\d+)?+(?!-)', str, perl=T))[[1]]
[1] "2011"    "750,000"

请参阅IDEONE demoregex demo。 由于正则表达式包含外观,因此您需要指定perl=TRUE参数。

模式说明

  • (?<!\d-) - 当一个带有hyhen的数字位于当前位置之前时,一个负面的背后导致比赛失败
  • \b\d+ - 一个单词边界(在下一个数字之前,不能有单词char - letter,digit或_
  • (?:[,.]\d+)?+ - 一个非捕获组((?:...)),匹配逗号或点([,.])的1或0个序列,后跟1个或多个数字(此序列匹配占有(见?+),以便正则表达式引擎在\b\d+之后没有检查连字符。
  • (?!-) - 如果检测到数字后有连字符,则表示匹配失败的负面loookahead。