Regex 删除所有标点符号的等效正则表达式
在R中,要从字符串中删除标点符号,我可以执行以下操作: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字符类,它只映射到: [!"#$%&'()*+,\-./:;<=>?@
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:]#]