删除R中除撇号以外的所有标点符号
我想使用R的gsub删除文本中除撇号以外的所有标点符号。我对regex相当陌生,但我正在学习 示例:删除R中除撇号以外的所有标点符号,r,R,我想使用R的gsub删除文本中除撇号以外的所有标点符号。我对regex相当陌生,但我正在学习 示例: x <- "I like %$@to*&, chew;: gum, but don't like|}{[] bubble@#^)( gum!?" gsub("[[:punct:]]", "", as.character(x)) x <- "I like %$@to*&, chew;: gum, but don't like|}{[] bubble@#^)( gum!
x <- "I like %$@to*&, chew;: gum, but don't like|}{[] bubble@#^)( gum!?"
gsub("[[:punct:]]", "", as.character(x))
x <- "I like %$@to*&, chew;: gum, but don't like|}{[] bubble@#^)( gum!?"
gsub("[^'[:^punct:]]", "", x, perl=T)
#[1] "I like to chew gum but don't like bubble gum"
期望的输出(我希望不要留下中的撇号)
以下是一个例子:
> gsub("(.*?)($|'|[^[:punct:]]+?)(.*?)", "\\2", x)
[1] "I like to chew gum but don't like bubble gum"
主要是为了多样性,这里有一个解决方案,它使用了同名的很棒的包中的
gsubfn()
。在这个应用程序中,我非常喜欢它所允许的解决方案的表现力:
library(gsubfn)
gsubfn(pattern = "[[:punct:]]", engine = "R",
replacement = function(x) ifelse(x == "'", "'", ""),
x)
[1] "I like to chew gum but don't like bubble gum"
(此处需要参数
engine=“R”
,否则将使用默认的tcl引擎。其匹配正则表达式的规则略有不同:例如,如果用于处理上述字符串,则需要设置pattern=“[[:punct:$|^]”
。感谢G.Grothendieck指出了这一细节。)x您可以使用双负号从POSIX类putt
中排除撇号:
[^'[:^punct:]]
代码:
x <- "I like %$@to*&, chew;: gum, but don't like|}{[] bubble@#^)( gum!?"
gsub("[[:punct:]]", "", as.character(x))
x <- "I like %$@to*&, chew;: gum, but don't like|}{[] bubble@#^)( gum!?"
gsub("[^'[:^punct:]]", "", x, perl=T)
#[1] "I like to chew gum but don't like bubble gum"
x正是我所希望的。比我想象的要复杂得多。难怪我有麻烦了。我真的要把你做的事拆开。谢谢。最后,这将是最简单的方法gsub(“.*?($|“|”[^[:punct:]]).*?,“\\1”,x)
。感谢您的跟进。它的工作原理与第一个一样好,并且更易于遵循+1一个警告——由于某种原因,字符类[:punct://code>在gsubfn()
调用的模式
参数中使用时,与调用gsub()
时使用的字符$
、
或^
不匹配。因此,我不得不“手动”添加它们。gsubfn
默认使用tcl正则表达式。如果希望使用R正则表达式,请使用参数engine=“R”
。@G.Grothendieck——感谢您指出这一点。我已经把它纳入了我的回答中。我使用了?gsubfn
中的文档,其中指出模式:与'gsub'
中的'pattern'相同,这意味着应该以相同的方式指定模式。现在我明白这是什么意思了,但我想知道在那里增加一行是否会有所帮助。类似于If engine=“R”,字符串将按照“help(regex)”中的说明进行匹配。如果使用默认的tcl引擎,模式将按照…
中的说明进行匹配。无论如何,感谢您对该软件包所做的工作!Kay您的代码确实删除了撇号。这就是我认为你的意思。gsub(“[^[:alnum:][:space:][],”,x)
。(FWIW,正则表达式中不需要反斜杠)。当然,如果文本包含非ascii字符(例如,多个脚本中的文本),则此答案会出错
x <- "I like %$@to*&, chew;: gum, but don't like|}{[] bubble@#^)( gum!?"
gsub("[^'[:^punct:]]", "", x, perl=T)
#[1] "I like to chew gum but don't like bubble gum"