等效的正则表达式,以删除所有标点符号

ags*_*udy 3 regex perl r

在R中,为了从字符串中删除标点符号,我可以这样做:

x <- 'a#,g:?s!*$t/{u}\d\&y'
gsub('[[:punct:]]','',x)
[1] "agstudy"
Run Code Online (Sandbox Code Playgroud)

这很聪明,但我没有严格控制删除的标点符号(想象一下我想在我的角色中保留一些符号).如何gsub在不忘记任何符号的情况下以更明确的方式重写此内容,如下所示:

gsub('[#,:?!*$/{}\\&]','',x,perl=FALSE)
Run Code Online (Sandbox Code Playgroud)

编辑

我遇到的困难是如何编写正则表达式(我更喜欢在R中)从x中删除所有标点字符,并仅保留#例如:

 "a#gstudy"
Run Code Online (Sandbox Code Playgroud)

Jos*_*ien 8

使用否定先行断言:

x <- 'a#,g:?s!*$t/{u}\\d\\&y'

gsub('(?!#)[[:punct:]]','',x, perl=TRUE)
# [1] "a#gstudy"
Run Code Online (Sandbox Code Playgroud)

这本质上是对每个字符进行两次测试,从前面的字符间空间询问一次是否下一个字符不是a "#",然后从字符本身开始,是否是标点符号.如果两个测试都为真,则会注册匹配并删除该字符.

  • 我不知道,但是比较`(?!#)[[:punct:]]`和`[[:punct:]]`的速度并不难,以了解负面前瞻减慢了多少下. (3认同)

Cas*_*yte 7

您可以使用否定的字符类,例如:

\pP 是标点字符的unicode字符类.

\PP 这一切都不是标点符号.

[^\PP] 这就是标点符号.

[^\PP~] 除了波浪号之外,这就是标点符号.

注意:您可以使用以下命令保持ASCII范围\p{PosixPunct}:

[^\P{PosixPunct}~]

或者在ASCII范围内使用具有此特殊性的unicode标点符号\p{XPosixPunct}:

[^\P{XPosixPunct}~]


A5C*_*2T1 5

此页面阅读表明[[:punct:]]字符应包括:

[-!"#$%&'()*+,./:;<=>?@[\\\]^_`{|}~]
Run Code Online (Sandbox Code Playgroud)

从R ?regex页面,我们也得到这个验证:

[:punct:]
Punctuation characters:
! " # $ % & ' ( ) * + , - . / : ; < = > ? @ [ \ ] ^ _ ` { | } ~
Run Code Online (Sandbox Code Playgroud)

因此,您可以使用它作为创建自己的模式的基础,排除您要保留的字符.


这很麻烦,特别是有两个更好的答案,但我只是想表现出我心中的愚蠢:

创建一个如下所示的函数:

newPunks <- function(CHARS) {
  punks <- c("!", "\\\"", "#", "\\$", "%", "&", "'", "\\(", "\\)",
             "\\*", "\\+", ",", "-", "\\.", "/", ":", ";", "<",
             "=", ">", "\\?", "@", "\\[", "\\\\", "\\]", "\\^", "_", 
             "`", "\\{", "\\|", "\\}", "~")
  keepers <- strsplit(CHARS, "")[[1]]
  keepers <- ifelse(keepers %in% c("\"", "$", "{", "}", "(", ")",
                                   "*", "+", ".", "?", "[", "]",
                                   "^", "|", "\\"), paste0("\\", keepers), keepers)
  paste(setdiff(punks, keepers), collapse="|")
}
Run Code Online (Sandbox Code Playgroud)

用法:

gsub(newPunks("#"), "", x)
# [1] "a#gstudy"
gsub(newPunks(""), "", x)
# [1] "agstudy"
gsub(newPunks("&#{"), "", x)
# [1] "a#gst{ud&y"
Run Code Online (Sandbox Code Playgroud)

Bleah.我上床睡觉的时间......