我錯誤地檢查格式爲A1A1A1的加拿大郵政編碼。 常見錯別字是位置2,4或6的大寫字母O而不是零,應該用0替換。R正則表達式只在特定的字符串位置選擇性地替換字符
我對於正則表達式相當陌生,而這一個讓我難住。 非常感謝!
我錯誤地檢查格式爲A1A1A1的加拿大郵政編碼。 常見錯別字是位置2,4或6的大寫字母O而不是零,應該用0替換。R正則表達式只在特定的字符串位置選擇性地替換字符
我對於正則表達式相當陌生,而這一個讓我難住。 非常感謝!
使用正則表達式如下GSUB中的功能,然後用0
(?<=^.)O|(?<=^.{3})O|(?<=^.{5})O
OR
您可以使用PCRE動詞(*SKIP)(*F)
替換所有匹配的字符。這僅將2,4,6位中的字母O
替換爲零0
。它不會關心其他職位上的字母或數字。
> x <- c('AOAOAO', 'O2O3O2', 'BOB1B2', 'C1COC3')
> gsub("(?:(?<=^).|(?<=^..).|(?<=^....).)(*SKIP)(*F)|O", "0", x, perl=TRUE)
[1] "A0A0A0" "O2O3O2" "B0B1B2" "C1C0C3"
您能否提供downvote的原因? – 2014-12-03 05:14:47
你可以做
x <- c("A0A0A0", "AOB0C0", "A0BOC0", "A0B0CO", "OOOOOO")
gsub("([A-Z])O", "\\10", x)
# [1] "A0A0A0" "A0B0C0" "A0B0C0" "A0B0C0" "O0O0O0"
的解釋了一下:
[A-Z]
是任意字符從A
到Z
([A-Z])
在這裏捕捉字符,因此它可以爲\\1
在替換([A-Z])O
引用是從A
到Z
後跟一個O
\\1
一個字符所捕獲的字符從A
到Z
\\10
是捕獲的字符後跟一個0
謝謝!而已!! – 2014-12-03 03:18:55
不客氣。請考慮通過點擊旁邊的勾號來接受您選擇的答案。 – flodel 2015-01-05 01:53:23
如果格式總是這樣,那麼可以使用gsub
來替換錯誤的「O」字符。
x <- c('A1A1A1', 'AOAOAO', 'A0B0CO', 'AOBOC0')
gsub('[A-Z]\\KO', '0', x, perl=T)
# [1] "A1A1A1" "A0A0A0" "A0B0C0" "A0B0C0"
1)使用gsubfn
,我們可以用特別簡單的正則表達式做到這一點。請注意,gsubfn
允許使用公式表示法指定第二個參數中的函數。這被視爲x
和y
與指示體的功能:
library(gsubfn)
gsubfn("(.)(.)", ~ paste0(x, chartr("O", "0", y)), "O0OO1A")
## [1] "O0O01A"
注意這與位置和數值位置之前,不依賴於該位置的一封信所以它的工作原理,即使之前字母被錯誤地編碼爲數字,例如哦,爲零。
2)以上很容易概括爲將偶數位置的零到零和奇數位置的零到零。正則表達式保持不變,只在第二個參數的變化指定的功能:
ohzero <- function(x, y) paste0(chartr("0", "O", x), chartr("O", "0", y))
gsubfn("(.)(.)", ohzero, "O00O1A")
## [1] "O0O01A"
3)或做加轉換的人眼睛(I)和眼睛的人使用這個功能,而不是ohzero
function(x, y) paste0(chartr("01", "OI", x), chartr("OI", "01", y))
給出一個例子以及預期的輸出。 – 2014-12-03 02:16:50
我認爲這個問題不應該被擱置,格式是指定的,並給出一個例子。答案似乎也解決了這個問題。投票重新開放。 – thelatemail 2014-12-03 03:53:42