2017-01-13 96 views
0

我試圖用gsub使用正則表達式輸入來清理一串凌亂的文本數據。我有以下表達式:文本清理和正則表達式

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

該表達式排除除了十六進制列表00 - 7A上的成員之外的所有內容。 (請參閱下面的列表以供參考。)

我的問題是:有沒有辦法重寫這個表達式仍然排除此列表的某些成員?例如,我希望它排除十六進制5F。我對正則表達式很陌生,不確定如何繼續。

enter image description here

+0

你CURENT表達式匹配比範圍以外的所有字符。通過從範圍中排除字符意味着您想匹配它。因此,你只需要一個替換:'x < - gsub(「[^ \\ x {00} - \\ x {7A}] | \\ x {5F}」,「」,x,perl = TRUE)' –

回答

0

從範圍嘗試

x <- as.data.table(x) 

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

請嘗試爲您的答案提供背景。獨立的答案可以解決這個特定情況下的問題,但是解釋可能解決許多未來的問題。試着包括你認爲會導致問題的原因以及你的答案爲什麼會解決問題。 – Newd

1

刪除5F:

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

您是否知道[本答案](http://stackoverflow.com/a/25609010/3576984)中的方法適用於R?我無法解決它... – MichaelChirico

+0

@MichaelChirico:使用ICU庫的stringr方法是可能的(雖然語法與Java有些不同)。 –

0

您正在使用PCRE正則表達式,所有非ASCII字符相匹配(順便說一句,等效PCRE正則表達式是"[^[:ascii:]]")。

你問你是否仍然可以匹配ASCII以外的所有字符,但匹配ASCII範圍5F(下劃線)中的一個字符。

這裏最簡單的方法是使用交替

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

|意味着OR,所以上面的正則表達式會匹配所有非ASCII字符和下劃線。請參閱R online demo

是否有替代方案? - 使用stringr packagestr_replace_all並充分利用character set unions:集

[[a-z][A-Z][0-9]]隱性邏輯或或聯盟。這些例子匹配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"