R-检测值中除句点以外的任何标点符号



我想检查列或值中除了句点.之外的任何标点符号。我看了很多类似的问题,但似乎都并没有答对。

期望输出:

"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=FALSEperl=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))

相关内容

最新更新