我正在尝试使用正则表达式输入使用gsub
清理一串杂乱的文本数据。我有以下表达式:
x <- gsub("[^\\x{00}-\\x{7A}]", "", x, perl = TRUE)
此表达式排除除十六进制列表00 - 7A上的成员之外的所有内容。 (参见下面的列表以供参考。)
我的问题是:有没有办法重写此表达式仍然排除此列表中的某些成员?例如,我希望它排除hex 5F。我是正则表达式的新手,不知道如何继续。
答案 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"