使用 gsub 在字符串中仅保留字母数字字符和空格

Posted

技术标签:

【中文标题】使用 gsub 在字符串中仅保留字母数字字符和空格【英文标题】:keep only alphanumeric characters and space in a string using gsub 【发布时间】:2017-09-03 19:15:23 【问题描述】:

我有一个包含字母数字字符、特殊字符和非 UTF-8 字符的字符串。我想去掉特殊字符和非 utf-8 字符。

这是我尝试过的:

gsub('[^0-9a-z\\s]','',"�+ Sample string here =��>E�BH�P<]��>")

但是,这会删除特殊字符(标点符号 + 非 utf8),但输出中没有空格。

gsub('/[^0-9a-z\\s]/i','',"�+ Sample string here =��>E�BH�P<]��>")

结果有空格,但仍然存在非 utf8 字符。

有什么解决办法吗?

对于上面的示例字符串,输出应该是: 此处为示例字符串

【问题讨论】:

你是不是想得到trimws(gsub('[^0-9A-Za-z ]','',"�+ Sample string here =��&gt;E�BH�P&lt;]��&gt;")) [^A-z0-9 ] 更简洁 @akrun。但是,这会留下“此处的示例字符串 EBHP]” [A-z] 不仅匹配字母。 【参考方案1】:

stringr 可以使用支持 POSIX 字符类的不同正则表达式引擎。 :ascii: 命名类,通常必须用方括号 [:ascii:] 括起来,在外部方括号内。 [^ 表示否定匹配。

library(stringr)
str_replace_all("�+ Sample string here =��>E�BH�P<]��>", "[^[:ascii:]]", "")

导致 [1] "+ 此处的示例字符串 =>EBHP"

【讨论】:

【参考方案2】:

您可以为此使用 [:alnum:][:space:] 类:

sample_string <- "�+ Sample 2 string here =��>E�BH�P<]��>"
gsub("[^[:alnum:][:space:]]","",sample_string)
#> [1] "ï Sample 2 string here ïïEïBHïPïï"

您也可以使用 PCRE 代码来引用特定的字符集:

gsub("[^\\pL0-9\\s]","",sample_string, perl = TRUE)
#> [1] "ï Sample 2 string here ïïEïBHïPïï"

这两种情况都清楚地表明,仍然存在的字符被视为字母。另外里面的EBHP还是字母,所以你要替换的条件不正确。您不想保留所有字母,只想保留 A-Z、a-z 和 0-9:

gsub("[^A-Za-z0-9 ]","",sample_string)
#> [1] " Sample 2 string here EBHP"

这仍然包含 EBHP。如果你真的只想保留一个只包含字母和数字的部分,你应该使用相反的逻辑:选择你想要的并替换除反向引用之外的所有内容:

gsub(".*?([A-Za-z0-9 ]+)\\s.*","\\1", sample_string)
#> [1] " Sample 2 string here "

或者,如果你想找到一个字符串,即使没有空格,也可以使用单词边界\\b

gsub(".*?(\\b[A-Za-z0-9 ]+\\b).*","\\1", sample_string)
#> [1] "Sample 2 string here"

这里发生了什么:

.*? 适合任何东西 (.) 至少 0 次 (*) 但不贪心 (?)。这意味着 gsub 将尝试尽可能少地适应这一部分。 () 之间的所有内容都将被存储,并且可以在替换时引用\\1 \\b 表示单词边界 其后至少有一次 (+) 后面是 A-Z、a-z、0-9 或空格的任何字符。您必须这样做,因为特殊字母包含在代码表的大写和小写之间。所以使用A-z 将包括所有特殊字母(顺便说一句,它们是UTF-8!) 在该序列之后,至少拟合零次以删除字符串的其余部分。 反向引用\\1 与正则表达式中的.* 结合使用,将确保输出中只保留所需的部分。

【讨论】:

添加 trimws() 以确保完整性。请注意,这仅有效,因为字符串以空格为界,除非这是真的,否则不会 100% 有效。 @zacdav 或者只是不要在最终结果中保留空格。 @zacdav 您对空格的评论是正确的,所以我添加了一个使用单词边界的示例。 我相信边界这个词的答案正是需要的,很好。

以上是关于使用 gsub 在字符串中仅保留字母数字字符和空格的主要内容,如果未能解决你的问题,请参考以下文章

Python移除指定文件夹中所有文件名称中的特殊字符(数字特殊字符空格等)只保留字母字符

Python移除指定文件夹中所有文件名称中的特殊字符(数字特殊字符空格等)只保留字母字符

在 R 中的一个 gsub() 或 chartr() 语句中替换多个字符串?

如何在 R 中使用 gsub 从字符串中删除非数字字符?

使用gsub在R中的空格之前提取字符串

数据库保留关键字