如何在R中删除特定的特殊字符

17

我有一些像这个句子这样的句子。

c = "In Acid-base reaction (page[4]), why does it create water and not H+?" 

我希望能够移除所有特殊字符,但保留'?&+-/'

我知道如果要删除所有特殊字符,可以使用

gsub("[[:punct:]]", "", c)
"In Acidbase reaction page4 why does it create water and not H"

然而,一些特殊字符例如+ - ?也会被删除,而我希望保留这些字符。

我试图创建一个特殊字符的字符串,以便在代码中使用,例如:

gsub("[special_string]", "", c)

我能做到的最好就是提供这个。

cat("!\"#$%()*,.:;<=>@[\\]^_`{|}~.")

然而,以下代码就是无法运行

gsub("[cat("!\"#$%()*,.:;<=>@[\\]^_`{|}~.")]", "", c)

我想知道如何去除特殊字符,但是有一些特定的字符我希望保留,怎么办?

谢谢

3个回答

27
gsub("[^[:alnum:][:blank:]+?&/\\-]", "", c)
# [1] "In Acid-base reaction page4 why does it create water and not H+?"

这真的有用。我只知道“^”表示行的开头(而“$”表示结尾)。你为什么用它来表示“保留”?能否解释一下? - wen
"^"是字符类否定标记(当它出现在开头时)。请查看?regex - IRTFM
1
@user3193265,正如IShouldBuyABoat所指出的那样,在字符范围([])内部的 ^ 具有不同的含义。还有几个其他字符也有不同的含义。例如,?+ 在字符范围内不是特殊字符,但 - 是(因此我们必须转义它)。在表达式内部,作为第一个字符,它表示否定,或者除了表达式内部的内容之外的所有内容。如果这回答了你的问题,请考虑将其标记为已回答。谢谢。 - BrodieG
似乎并不适用于所有特殊字符,比如 '•'。它们似乎幸存下来了... - Fabian Werner
为了保留“.”,只需在字符范围内添加\\.gsub("[^[:alnum:][:blank:]+?&/\\-\\.]", "", c)。(\是转义字符,使正则表达式将"."识别为文本,而不是匹配任何字符的符号。) - Matt L.

7
为了让你的方法起作用,你需要在前导的"["后面立即放置文字"]"。
 gsub("[][!#$%()*,.:;<=>@^_`|~.{}]", "", c)
[1] "In Acid-base reaction page4 why does it create water and not H+?"

你可以在任何位置放置内部的“[”。如果你需要排除减号,它必须放在最后。请参考 ?regex 页面,在列出所有特殊预定义字符类之后。

5

我认为你需要一个正则表达式的解决方案。 我会给你一个混乱的解决方案和一个包添加解决方案(无耻地自我推销)。

可能有更好的正则表达式:

x <- "In Acid-base reaction (page[4]), why does it create water and not H+?" 
keeps <- c("+", "-", "?")

## Regex solution
gsub(paste0(".*?($|'|", paste(paste0("\\", 
    keeps), collapse = "|"), "|[^[:punct:]]).*?"), "\\1", x)

#qdap: addon package solution
library(qdap)
strip(x, keeps, lower = FALSE)

## [1] "In Acid-base reaction page why does it create water and not H+?"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接