我想检查列或值中除了句点.
之外的任何标点符号。我看了很多类似的问题,但似乎都并没有答对。
期望输出:
"1.0" FALSE
"-1.0" TRUE
"-1" TRUE
"1+" TRUE
尝试次数:
> grepl("([.])[[:punct:]]", "1.0")
[1] FALSE
> grepl("([.])[[:punct:]]", "-1.0")
[1] FALSE
> grepl("(.)[[:punct:]]", "-1.0")
[1] TRUE
> grepl("(.)[[:punct:]]", "1.0")
[1] TRUE
基于R是优选的,但却是必需的。
您可以使用负前瞻、将.
与(?![.])[[:punct:]]
或(?!\.)[[:punct:]]
一起从[:punct:]
中排除
x <- c("1.0", "-1.0", "-1", "1+")
grepl("(?![.])[[:punct:]]", x, perl=TRUE)
#[1] FALSE TRUE TRUE TRUE
或使用双重否定,如@A5C1D2H2I1M1N2O1R2T1在评论中给出的。
grepl("[^[:^punct:].]", x, perl=TRUE)
#[1] FALSE TRUE TRUE TRUE
但是,对于给定的示例[-+]
、[^[:digit:].]
或[^0-9.]
来说,显式并使用可能会更好,
grepl("[-+]", x)
#[1] FALSE TRUE TRUE TRUE
grepl("[^[:digit:].]", x)
#[1] FALSE TRUE TRUE TRUE
grepl("[^0-9.]", x)
#[1] FALSE TRUE TRUE TRUE
作为,如果一个区域设置有效,它可能会改变[[:punct:]]的行为,并且在perl=FALSE
和perl=TRUE
之间的更改会将其更改为.
gsub("[^[:punct:]]", "", intToUtf8(c(32:126, 160:255)), perl=FALSE)
#[1] "!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~ ¡¢£¤¥¦§¨©«¬®¯°±²³´¶·¸¹»¼½¾¿×÷"
gsub("[^[:punct:]]", "", intToUtf8(c(32:126, 160:255)), perl=TRUE)
#[1] "!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~"
另请参阅:在R中,使用gsub删除除句点以外的所有标点符号,R正则表达式删除除撇号或删除R.中除撇号外的所有标点符号
将其分为两步。第一次删除句点,第二次检测(剩余(标点符号:
grepl("[[:punct:]]", gsub("\.", "", x))
## use fixed = TRUE for a bit more speed in the gsub
grepl("[[:punct:]]", gsub(".", "", x, fixed = TRUE))