[英]Match everything but numbers regular expression
我希望有一個正則表達式匹配任何不正確的數學數字。 下面的列表是一個示例列表作為正則表達式的輸入:
1
1.7654
-2.5
2-
2.
m
2..3
2....233..6
2.2.8
2--5
6-4-9
所以前三個( 粗體 )不應該被選中,剩下的應該被選中。 這是另一篇文章的一個密切話題,但由於它的負面性質,它是不同的。
我正在使用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)
哪個輸出:
\[1\] 1 2 3 4 5 7 8 9 10 11
您可以使用以下正則表達式:
^(?:((\d+(?=[^.]+|\.{2,})).)+|(\d\.){2,}).*|[^\d]+$
請參閱演示https://regex101.com/r/tZ3uH0/6
請注意,您的正則表達式引擎應支持使用可變長度的前瞻。您需要使用multi-line
標記,並且如注釋中所述,您可以使用perl=T
在R中激活前瞻。
這個正則表達式包含2個與OR連接的部分。第一部分是:
(?:((\d+(?=[^.]+|\.{2,})).)+|(\d\.){2,}).*
它將匹配除了點之外的任何數字的組合或者由2個或更多點組成的數字組合。其中整個數據位於可以重復的捕獲組內,而不是該組,您可以有一個數字后面跟着點2或更多時間(用於匹配某些字符串,如2.3.4.
)。
在第二部分,我們有[^\\d]+
,它將匹配除數字之外的任何東西。
我認為這應該做的工作:
re <- "^-?[0-9]+$|^-?[0-9]+\\.[0-9]+$"
R> a[!grepl(re, a)]
#[1] "2-" "2." "m" "2..3" "2....233..6" "2.2.8" "2--5"
#[8] "6-4-9"
a[grep("^-?\\d*(\\.?\\d*)$", a, invert=T)]
使用@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
這里的解決方案很好。 您只需添加否定案例[ - ]並反轉選擇!
a <- c("1", "1.7654", "-2.5", "2-", "2.", "m", "2..3", "2....233..6", "2.2.8", "2--5", "6-4-9")
a[grep(pattern="(^[1-9]\\d*(\\.\\d+)?$)|(^[-][1-9]\\d*(\\.\\d+)?$)",invert=TRUE, x=a)]
[1] "2-" "2." "m" "2..3" "2....233..6"
[6] "2.2.8" "2--5" "6-4-9"
試試這個:
a[!grepl("^\\-?\\d?\\.?\\d+$", a)]
我喜歡as.numeric()的簡單性。 這是我的建議:
require(stringr)
a <- c("1", "1.7654", "-2.5", "2-", "2.", "m", "2..3", "2....233..6", "2.2.8", "2--5", "6-4-9")
a
a1 <- ifelse(str_sub(a, -1) == ".", "string filler", a)
a1
outvect <- is.na(as.numeric(a1))
outvect
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.