我使用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,]*
错误了吗?
我了解到数字正则表达式匹配很复杂,所以这段代码不应该用于生产,我只是想了解为什么它在这种特定情况下失败了。
答案 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"