R中数字的正则表达式匹配

时间:2015-07-24 20:28:06

标签: regex r

我使用stringr包在R中学习正则表达式匹配,但我不明白为什么

str_match("1,000,222.333 /month", "[\\d,]*\\.?\\d*")
     [,1]          
[1,] "1,000,222.333"

返回所需的结果,而

str_match("about $1,000,222.33 em's", "[\\d,]*\\.?\\d*")
     [,1]
[1,] ""  

返回空字符串?我的[\\d,]*错误了吗?

我了解到数字正则表达式匹配很复杂,所以这段代码不应该用于生产,我只是想了解为什么它在这种特定情况下失败了。

2 个答案:

答案 0 :(得分:3)

您可以使用+来匹配一个或多个字符,而不是匹配0或更多字符的*

 str_match(v1, "[\\d,]+\\.?\\d*")
 #    [,1]           
 #[1,] "1,000,222.33" 
 #[2,] "1,000,222.333"

数据

 v1 <- c("about $1,000,222.33 em's", "1,000,222.333 /month")

答案 1 :(得分:2)

详细说明,问题是*运算符。由于此运算符允许正则表达式引擎匹配零个或多个字符,[\d,]*告诉引擎匹配零个或多个数字或文字字符, - 可能根本不匹配。我会写如下:

str_match(x, '[\\d,]+(?:\\.\\d+)?')

或者从 qdapRegex 包中有效地使用rm_number(我为此写的正则表达式):

library(qdapRegex)

x <- c("about $1,000,222.33 em's", "1,000,222.333 /month")
rm_number(x, extract=TRUE)

# [[1]]
# [1] "1,000,222.33"

# [[2]]
# [1] "1,000,222.333"