删除 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 中除撇号外的所有标点符号的主要内容,如果未能解决你的问题,请参考以下文章