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

Posted

技术标签:

【中文标题】删除 R 中除撇号外的所有标点符号【英文标题】:Remove all punctuation except apostrophes in R 【发布时间】:2012-01-31 14:18:31 【问题描述】:

我想使用 R 的 gsub 从文本中删除除撇号之外的所有标点符号。我对正则表达式相当陌生,但正在学习。

示例:

x <- "I like %$@to*&, chew;: gum, but don't like|[] bubble@#^)( gum!?"
gsub("[[:punct:]]", "", as.character(x))

电流输出(don't 中没有撇号)

[1] "I like to chew gum but dont like bubble gum"

期望的输出(我希望撇号不要留下)

[1] "I like to chew gum but don't like bubble gum"

【问题讨论】:

【参考方案1】:
x <- "I like %$@to*&, chew;: gum, but don't like|[] bubble@#^)( gum!?"
gsub("[^[:alnum:][:space:]']", "", x)

[1] "I like to chew gum but don't like bubble gum"

上面的正则表达式更直接。它将所有不是字母数字符号、空格或撇号(插入符号!)的内容替换为空字符串。

【讨论】:

凯你的代码确实删除了撇号。这就是我认为你的意思gsub("[^[:alnum:][:space:]'\"]", "", x) 我喜欢这种编码的直接性。 +1 -- 在我看来,这里的想法是最清晰的解决方案。只需编辑第二行以读取gsub("[^[:alnum:][:space:]']", "", x),它就是金色的。 (FWIW,正则表达式中不需要反斜杠)。 当然,如果您的文本包含非 ascii 字符(例如,多个脚本中的文本),这个答案就会不正常【参考方案2】:

这是一个例子:

>  gsub("(.*?)($|'|[^[:punct:]]+?)(.*?)", "\\2", x)
[1] "I like to chew gum but don't like bubble gum"

【讨论】:

正是我所希望的。比我想象的要复杂得多。难怪我遇到了麻烦。我真的会分解你所做的。谢谢。 最后这将是最简单的方法gsub(".*?($|'|[^[:punct:]]).*?", "\\1", x) 感谢您的跟进。它和第一个一样好用,而且更容易理解。 +1【参考方案3】:

您可以使用双重否定从 POSIX 类 punct 中排除撇号:

[^'[:^punct:]]

代码:

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"

ideone demo

【讨论】:

【参考方案4】:

主要是为了多样化,这里有一个使用来自同名的好包的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 指出了这个细节。)

【讨论】:

一个警告——由于某种原因,字符类[:punct:],当用于gsubfn() 调用的pattern 参数时,与字符$| 不匹配,或^,就像调用gsub()一样。因此,我不得不“手动”添加它们。 gsubfn 默认使用 tcl 正则表达式。如果您希望使用 R 正则表达式,请使用参数 engine = "R" @G.Grothendieck -- 感谢您指出这一点。我已将其合并到我的答案中。我采用了?gsubfn 中的文档,其中指出pattern: Same as 'pattern' in 'gsub' 意味着应该以相同的方式指定模式。现在我明白了这是什么意思,但想知道那里的附加行是否有帮助。像If engine="R", character strings will be matched as documented by 'help(regex)'. If the default tcl engine is used, patterns will be matched as documented at ... 这样的东西。无论如何,感谢您在包上所做的工作!

以上是关于删除 R 中除撇号外的所有标点符号的主要内容,如果未能解决你的问题,请参考以下文章

在 R 中,使用 gsub 删除除句点之外的所有标点符号

从R中的字符串中删除所有特殊字符?

r 用gsub删除标点符号

是否有一个函数可以从字符串中删除任何符号(%、# 等)? [复制]

R- 删除字符串中的重音符号

从R中的文本中删除单词和符号