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"
答案 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 demo和regex demo。
由于正则表达式包含外观,因此您需要指定perl=TRUE
参数。
模式说明:
(?<!\d-)
- 当一个带有hyhen的数字位于当前位置之前时,一个负面的背后导致比赛失败\b\d+
- 一个单词边界(在下一个数字之前,不能有单词char - letter,digit或_
)(?:[,.]\d+)?+
- 一个非捕获组((?:...)
),匹配逗号或点([,.]
)的1或0个序列,后跟1个或多个数字(此序列匹配占有(见?+
),以便正则表达式引擎在\b\d+
之后没有检查连字符。(?!-)
- 如果检测到数字后有连字符,则表示匹配失败的负面loookahead。