使用 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 =��>E�BH�P<]��>"))
[^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移除指定文件夹中所有文件名称中的特殊字符(数字特殊字符空格等)只保留字母字符