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

Regex 删除所有标点符号的等效正则表达式,regex,r,perl,Regex,R,Perl,在R中,要从字符串中删除标点符号,我可以执行以下操作: x <- 'a#,g:?s!*$t/{u}\d\&y' gsub('[[:punct:]]','',x) [1] "agstudy" 编辑 我遇到的困难是如何编写正则表达式(我更喜欢用R)来删除x中的所有标点符号,并只保留#例如: "a#gstudy" 它在Perl中的工作原理完全相同,[:punct://code>是一个POSIX字符类,它只映射到: [!"#$%&'()*+,\-./:;<=>?@

在R中,要从字符串中删除标点符号,我可以执行以下操作:

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

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

 "a#gstudy"

它在Perl中的工作原理完全相同,
[:punct://code>是一个POSIX字符类,它只映射到:

[!"#$%&'()*+,\-./:;<=>?@[\\\]^_`{|}~]
读取at表示
[[:punct:]
字符应包括:

[-!"#$%&'()*+,./:;<=>?@[\\\]^_`{|}~]
因此,您可以使用它作为创建自己的模式的基础,不包括您想要保留的字符


这真是一团糟,尤其是有两个更好的答案,但我只是想展示我心中的愚蠢:

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

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


萧瑟。我该睡觉了……

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

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

\PP
是所有不是标点符号的字符

[^\PP]
就是标点符号

[^\PP~]
是除波浪号以外的所有标点符号

注意:您可以使用
\p{PosixPunct}
保持在ASCII范围内:

或者在ASCII范围内使用具有这种特殊性的unicode标点字符,与
\p{xposexpunct}


[^\p{XPosixPunct}~]

使用否定的先行断言:

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

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

x简单的方法是使用前向或后向两次匹配同一个字符,一次确保它是点状,一次确保它不是“

不过,Lookahead和lookbehind有点贵。当我们找到标点符号时,只使用一个标点符号比在每个位置使用环视更有效

[[:punct:]](?<!#)

我还没有用R测试过这些,但它们至少应该可以用
perl=TRUE

感谢+1的链接。这里的困难是在gsub中(手工)编写正则表达式。但是我会做的@agstudy,我要编辑的要点是,既然我们知道这个类包含哪些字符,我们可能可以创建我们自己的模式,可能使用这些字符的向量和
setdiff
或其他什么。是和否。我们应该知道符号,以及如何在gsub中编写正则表达式,
gsub([-!“#$%&'))*+,./:;?@[/\/\]^
{124;}~],'',x)`将失败。例如,我知道,在这里编写正则表达式并不容易。谢谢。问题不是要有等价的perl代码,而是要有等价的使用符号的正则表达式(手工)。不确定为什么要标记Perl,但字符类只是映射到上面列出的字符。标记Perl是因为,Perl正则表达式可以在R中使用。
grep(pattern,x,ignore.case=FALSE,Perl=TRUE,…)
interest+1!我如何在R/Perl中使用它?例如
gsub(“[^p#]”,x,Perl=F)
,保留#,但它会删除所有其他好字符…@agstudy:No,
\pP
\pP
是字符类,因为
\w
\w
是标点字符。对于您的示例,您必须编写
[^\pP\35;]
谢谢。我几乎接近
gsub(“[^\\pP\35;],”,x,perl=TRUE)
,我得到了“agstudy#$”`,我不知道为什么我的末尾有美元($)。有什么想法吗?@agstudy:原因是
$
不是unicode的标点符号。但是如果使用posix版本
\P{PosixPunct}
它是不同的,因为ASCII范围内的标点字符定义如下:所有这些都不是控件、空格或字母数字字符。谢谢。你认为我用这个解决方案会遇到一些性能问题(我有一个巨大的数据集要过滤)吗?我不知道,但是比较
(?!#)和
[:punct:]
的速度并不难,这样就可以了解负面展望会使事情变得多么慢。
gsub(newPunks("#"), "", x)
# [1] "a#gstudy"
gsub(newPunks(""), "", x)
# [1] "agstudy"
gsub(newPunks("&#{"), "", x)
# [1] "a#gst{ud&y"
x <- 'a#,g:?s!*$t/{u}\\d\\&y'

gsub('(?!#)[[:punct:]]','',x, perl=TRUE)
# [1] "a#gstudy"
(?=[^#])[[:punct:]]
(?!#)[[:punct:]]
[[:punct:]](?<!#)
[^[:^punct:]#]