从R中的字符串中删除所有特殊字符?
Posted
技术标签:
【中文标题】从R中的字符串中删除所有特殊字符?【英文标题】:Remove all special characters from a string in R? 【发布时间】:2012-05-04 21:00:56 【问题描述】:如何从R中的字符串中删除所有特殊字符并用空格替换它们?
要删除的一些特殊字符是:~!@#$%^&*()_+:"<>?,./;'[]-=
我尝试使用[:punct:]
模式使用regex
,但它只删除标点符号。
问题 2:以及如何从外语中删除字符,例如:â í ü Â á ą ę ś ć
?
答案:在regex
或regexpr
函数中使用[^[:alnum:]]
删除~!@#$%^&*()_+:"<>?,./;'[]-=
并使用[^a-zA-Z0-9]
删除â í ü Â á ą ę ś ć
。
基础 R 中的解决方案:
x <- "a1~!@#$%^&*()_+:\"<>?,./;'[]-="
gsub("[[:punct:]]", "", x) # no libraries needed
【问题讨论】:
“特殊字符”的定义是什么? 我自己的定义是所有非 Unicode 字符 ;-)。但我想很多其他人会不同意。 不妨看看sub
或gsub
函数。
正则表达式 [:punct:] 将完成一半或全部工作
【参考方案1】:
您需要使用regular expressions 来识别不需要的字符。对于最易于阅读的代码,您需要 stringr
包中的 str_replace_all
,尽管来自基本 R 的 gsub
也可以。
确切的正则表达式取决于您要执行的操作。您可以只删除您在问题中给出的那些特定字符,但删除所有标点符号要容易得多。
x <- "a1~!@#$%^&*()_+:\"<>?,./;'[]-=" #or whatever
str_replace_all(x, "[[:punct:]]", " ")
(基本的 R 等效项是 gsub("[[:punct:]]", " ", x)
。)
另一种方法是换掉所有非字母数字字符。
str_replace_all(x, "[^[:alnum:]]", " ")
请注意,构成字母、数字或标点符号的定义会因您所在的地区而略有不同,因此您可能需要进行一些试验才能得到您想要的。
【讨论】:
不错的答案 +1 您可能希望将" "
替换为 ""
否则字符串中有空白区域。
@TylerRinker:是的,尽管 QBik 确实特别要求空格。
如何删除那些疯狂的角色:â í ü Â á
?
你需要阅读正则表达式。从我回答中的链接开始,然后阅读?regex
和?regexpr
。
尝试用[^a-zA-Z0-9]
或\\W
替换[^[:alnum:]]
。【参考方案2】:
不要使用正则表达式来删除那些“疯狂”的字符,只需将它们转换为 ASCII,这将删除重音,但会保留字母。
astr <- "Ábcdêãçoàúü"
iconv(astr, from = 'UTF-8', to = 'ASCII//TRANSLIT')
导致
[1] "Abcdeacoauu"
【讨论】:
我必须添加iconv(astr, from="UFT-8", to="ASCII//TRANSLIT")
,否则像ç
这样的法语字符会有点好笑。
Windoze 在美国没有工作人员,我得到一个 'NA' ... Sys.getlocale()
... LC_COLLATE=English_United States.1252;LC_CTYPE=English_United States.1252;LC_MONETARY=English_United States.1252;LC_NUMERIC=C;LC_TIME=English_United States.1252
这有效:str = "Ábcdêãçoàúü"; str = iconv(str, from = '', to = 'ASCII//TRANSLIT'); str;
也可以在windows中使用readlines( data, encoding="UTF-8")
【参考方案3】:
将特殊字符转换为撇号,
Data <- gsub("[^0-9A-Za-z///' ]","'" , Data ,ignore.case = TRUE)
下面的代码删除多余的'''撇号
Data <- gsub("''","" , Data ,ignore.case = TRUE)
使用gsub(..)
函数将特殊字符替换为撇号
【讨论】:
那些已经包含''
两个连续撇号的预先存在的代码或cmets呢?那些不会受到影响吗?不需要先保护/转义这些吗?以上是关于从R中的字符串中删除所有特殊字符?的主要内容,如果未能解决你的问题,请参考以下文章