文字清理和正则表达

时间:2017-01-13 14:23:26

标签: r regex gsub

我正在尝试使用正则表达式输入使用gsub清理一串杂乱的文本数据。我有以下表达式:

x <- gsub("[^\\x{00}-\\x{7A}]", "", x, perl = TRUE)

此表达式排除除十六进制列表00 - 7A上的成员之外的所有内容。 (参见下面的列表以供参考。)

我的问题是:有没有办法重写此表达式仍然排除此列表中的某些成员?例如,我希望它排除hex 5F。我是正则表达式的新手,不知道如何继续。

enter image description here

3 个答案:

答案 0 :(得分:1)

从范围中移除5F:

x <- gsub("[^\\x{00}-\\x{5E}\\x{60}-\\x{7A}]", "", x, perl = TRUE)

答案 1 :(得分:0)

尝试

x <- as.data.table(x)

x <- x[,lapply(.SD,function(x){gsub("_","",x)})]

答案 2 :(得分:0)

您正在使用匹配所有非ASCII字符的PCRE正则表达式(BTW,等效的PCRE正则表达式为"[^[:ascii:]]")。

您询问是否仍然可以匹配ASCII以外的所有字符,但匹配ASCII范围中的字符5F(下划线)。

这里最简单的方法是使用交替

x <- gsub("[^\\x{00}-\\x{7A}]|\\x{5F}", "", x, perl = TRUE)

|表示 OR ,因此上面的正则表达式将匹配所有非ASCII字符和下划线。请参阅R online demo

还有替代方案吗? - 使用stringr package str_replace_all并利用character set unions

  

[[a-z][A-Z][0-9]]隐式逻辑OR或集合联盟。示例匹配ASCII
  [a-zA-Z0-9]]个字母和数字。这两种形式是等价的。

此构造的最佳用例是组合否定和非否定字符类:

> library(stringr)
> x <- c("_Gołąb", "Василий_Bam-Bam-Bigelow")
> str_replace_all(x, "[^\\x{00}-\\x{7A}]", "") ## No excluded char
[1] "_Golab"           "_Bam-Bam-Bigelow"
> str_replace_all(x, "[[^\\x{00}-\\x{7A}][\\x{5F}]]", "") ## With an excluded char that is also matched
[1] "Golab"           "Bam-Bam-Bigelow"