我試圖用gsub
使用正則表達式輸入來清理一串凌亂的文本數據。我有以下表達式:文本清理和正則表達式
x <- gsub("[^\\x{00}-\\x{7A}]", "", x, perl = TRUE)
該表達式排除除了十六進制列表00 - 7A上的成員之外的所有內容。 (請參閱下面的列表以供參考。)
我的問題是:有沒有辦法重寫這個表達式仍然排除此列表的某些成員?例如,我希望它排除十六進制5F。我對正則表達式很陌生,不確定如何繼續。
我試圖用gsub
使用正則表達式輸入來清理一串凌亂的文本數據。我有以下表達式:文本清理和正則表達式
x <- gsub("[^\\x{00}-\\x{7A}]", "", x, perl = TRUE)
該表達式排除除了十六進制列表00 - 7A上的成員之外的所有內容。 (請參閱下面的列表以供參考。)
我的問題是:有沒有辦法重寫這個表達式仍然排除此列表的某些成員?例如,我希望它排除十六進制5F。我對正則表達式很陌生,不確定如何繼續。
從範圍嘗試
x <- as.data.table(x)
x <- x[,lapply(.SD,function(x){gsub("_","",x)})]
請嘗試爲您的答案提供背景。獨立的答案可以解決這個特定情況下的問題,但是解釋可能解決許多未來的問題。試着包括你認爲會導致問題的原因以及你的答案爲什麼會解決問題。 – Newd
刪除5F:
x <- gsub("[^\\x{00}-\\x{5E}\\x{60}-\\x{7A}]", "", x, perl = TRUE)
您是否知道[本答案](http://stackoverflow.com/a/25609010/3576984)中的方法適用於R?我無法解決它... – MichaelChirico
@MichaelChirico:使用ICU庫的stringr方法是可能的(雖然語法與Java有些不同)。 –
您正在使用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"
你CURENT表達式匹配比範圍以外的所有字符。通過從範圍中排除字符意味着您想匹配它。因此,你只需要一個替換:'x < - gsub(「[^ \\ x {00} - \\ x {7A}] | \\ x {5F}」,「」,x,perl = TRUE)' –