我希望有一个正则表达式匹配任何不正确的数学数字.下面的列表是一个示例列表作为正则表达式的输入:
1
1.7654
-2.5
2-
2.
m
2..3
2....233..6
2.2.8
2--5
6-4-9
Run Code Online (Sandbox Code Playgroud)
所以前三个(粗体)不应该被选中,其余的应该被选中.这是另一篇文章的一个密切话题,但由于它的负面性质,它是不同的.
我正在使用R,但我猜任何正则表达式.以下是上述帖子中的最佳镜头:
a <- c("1", "1.7654", "-2.5", "2-", "2.", "m", "2..3", "2....233..6", "2.2.8", "2--5", "6-4-9")
grep(pattern="(-?0[.]\\d+)|(-?[1-9]+\\d*([.]\\d+)?)|0$", x=a)
Run Code Online (Sandbox Code Playgroud)
哪个输出:
\[1\] 1 2 3 4 5 7 8 9 10 11
Run Code Online (Sandbox Code Playgroud)
a[grep("^-?\\d*(\\.?\\d*)$", a, invert=T)]
Run Code Online (Sandbox Code Playgroud)
根据@Frank 的建议编辑。
速度测试
a <- rep(a, 1e4)
all.equal(a[is.na(as.numeric(a))], a[grep("^-?\\d+(\\.?\\d+)?$|^\\d+\\.$", a, invert=T)])
[1] TRUE
library(microbenchmark)
microbenchmark(dosc = a[is.na(as.numeric(a))],
plafort = a[grep("^-?\\d*(\\.?\\d*)$", a, invert=T)])
# Unit: milliseconds
# expr min lq mean median uq max neval
# dosc 27.83477 28.32346 28.69970 28.51254 28.76202 31.24695 100
# plafort 31.92118 32.14915 32.62036 32.33349 32.71107 35.12258 100
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1474 次 |
| 最近记录: |