Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
删除R中除撇号以外的所有标点符号_R - Fatal编程技术网

删除R中除撇号以外的所有标点符号

删除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!

我想使用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!?"
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"