首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在R中,使用gsub删除除句点以外的所有标点符号。

在R中,使用gsub删除除句点以外的所有标点符号。
EN

Stack Overflow用户
提问于 2014-02-03 17:39:28
回答 4查看 48.6K关注 0票数 19

我是新来的,所以我希望你能帮我。

我想使用gsub删除除句号和减号以外的所有标点符号,以便在数据中保留小数点和负号。

示例

我的数据框架z有以下数据:

代码语言:javascript
运行
复制
     [,1] [,2]   
[1,] "1"  "6"    
[2,] "2@"  "7.235"
[3,] "3"  "8"    
[4,] "4"  "$9"   
[5,] "£5" "-10" 

我想使用gsub("[[:punct:]]", "", z)删除标点符号。

电流输出

代码语言:javascript
运行
复制
> gsub("[[:punct:]]", "", z)
     [,1] [,2]  
[1,] "1"  "6"   
[2,] "2"  "7235"
[3,] "3"  "8"   
[4,] "4"  "9"   
[5,] "5"  "10" 

然而,我想保留"-“的标志和”。“签名。

期望输出

代码语言:javascript
运行
复制
 PSEUDO CODE:  
> gsub("[[:punct:]]", "", z, except(".", "-") )
         [,1] [,2]  
    [1,] "1"  "6"   
    [2,] "2"  "7.235"
    [3,] "3"  "8"   
    [4,] "4"  "9"   
    [5,] "5"  "-10" 

有什么想法吗?如何使一些字符不受gsub()函数的约束?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2014-02-03 17:59:46

你可以放一些这样的火柴:

代码语言:javascript
运行
复制
 sub("([.-])|[[:punct:]]", "\\1", as.matrix(z))
     X..1. X..2.  
[1,] "1"   "6"    
[2,] "2"   "7.235"
[3,] "3"   "8"    
[4,] "4"   "9"    
[5,] "5"   "-10"  

这里我保留了.-

我猜,下一步是强迫你得到一个数字矩阵,所以这里我把这两个步骤结合起来,如下所示:

代码语言:javascript
运行
复制
matrix(as.numeric(sub("([.-])|[[:punct:]]", "\\1", as.matrix(z))),ncol=2)
   [,1]    [,2]
[1,]    1   6.000
[2,]    2   7.235
[3,]    3   8.000
[4,]    4   9.000
[5,]    5 -10.000
票数 22
EN

Stack Overflow用户

发布于 2019-04-23 05:05:27

你可以试试这段代码。我发现它很方便。

代码语言:javascript
运行
复制
x <- c('6,345', '7.235', '8', '$9', '-10')
gsub("[^[:alnum:]\\-\\.\\s]", "", x)

[1] "6345"  "7.235" "8"     "9"     "-10"

x <- c('1', '2@', '3', '4', '£5')
gsub("[^[:alnum:]\\-\\.\\s]", "", x)

[1] "1" "2" "3" "4" "5"

此代码{gsub(“[^:alnum:]”、"“、x)}删除所有不包括字母数字术语的内容。然后我们添加到异常列表中。这里我们添加连字符(-),句号(.)和获得gsub的空间(“[^:alnum:-.\s]”、"“、”x“)。现在,它删除了所有不是字母数字,连字符,句号和空格。

票数 8
EN

Stack Overflow用户

发布于 2020-03-03 20:00:22

下面是一些使用基R (g)substringr移除/替换函数在R中限制泛型字符类的选项:

(g)sub perl=TRUE

您可以将[[:punct:]]括号表达式与[:punct:] POSIX字符类一起使用,并将其限制为(?!\.)负前瞻,这将要求右边后面的字符不等于.

代码语言:javascript
运行
复制
(?!\.)[[:punct:]]      # Excluding a dot only
(?![.-])[[:punct:]]    # Excluding a dot and hyphen

若要匹配一个或多个事件,请将其包装为非捕获组,然后将+量词设置为组:

代码语言:javascript
运行
复制
(?:(?!\.)[[:punct:]])+   # Excluding a dot only
(?:(?![.-])[[:punct:]])+ # Excluding a dot and hyphen

注意,当删除找到的匹配时,这两个表达式将产生相同的结果,但是,当您需要用其他字符串/char替换时,量化将允许使用替换模式的单个出现来更改整个连续字符块。

stringr 替换/删除函数

在详细讨论之前,请注意,与(g)sub一起使用的PCRE (g)sub将不匹配由ICU regex库驱动的stringr正则表达式中的相同字符。您需要使用[\p{P}\p{S}]代替,请参阅R/regex与stringi/ICU:为什么'+‘被认为是非字符[:点:]字符?

ICU regex库有一个很好的特性,可以与字符类一起使用,称为字符类减法

因此,您编写字符类,例如,所有标点符号匹配类(如[\p{P}\p{S}] ),然后要“排除”(=减去)一个字符或两个或三个字符,或一个字符的整个子类。您可以使用两个符号:

代码语言:javascript
运行
复制
[\p{P}\p{S}&&[^.]]   # Excluding a dot
[\p{P}\p{S}--[.]]    # Excluding a dot
[\p{P}\p{S}&&[^.-]]  # Excluding a dot and hyphen
[\p{P}\p{S}--[.-]]   # Excluding a dot and hyphen

若要将1+连续事件与此方法匹配,不需要任何包装组,只需使用+即可。

代码语言:javascript
运行
复制
[\p{P}\p{S}&&[^.]]+  # Excluding a dot
[\p{P}\p{S}--[.]]+   # Excluding a dot
[\p{P}\p{S}&&[^.-]]+  # Excluding a dot and hyphen
[\p{P}\p{S}--[.-]]+   # Excluding a dot and hyphen

请参阅具有输出的r演示测试

代码语言:javascript
运行
复制
x <- "Abc.123#&*xxx(x-y-z)???? some@other!chars."

gsub("(?!\\.)[[:punct:]]", "", x, perl=TRUE)
## => [1] "Abc.123xxxxyz someotherchars."
gsub("(?!\\.)[[:punct:]]", "~", x, perl=TRUE)
## => [1] "Abc.123~~~xxx~x~y~z~~~~~ some~other~chars."
gsub("(?:(?!\\.)[[:punct:]])+", "~", x, perl=TRUE)
## => [1] "Abc.123~xxx~x~y~z~ some~other~chars."

library(stringr)
stringr::str_remove_all(x, "[\\p{P}\\p{S}&&[^.]]") # Same as "[\\p{P}\\p{S}--[.]]"
## => [1] "Abc.123xxxxyz someotherchars."
stringr::str_replace_all(x, "[\\p{P}\\p{S}&&[^.]]", "~")
## => [1] "Abc.123~~~xxx~x~y~z~~~~~ some~other~chars."
stringr::str_replace_all(x, "[\\p{P}\\p{S}&&[^.]]+", "~")  # Same as "[\\p{P}\\p{S}--[.]]+"
## => [1] "Abc.123~xxx~x~y~z~ some~other~chars."
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21533899

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档