我错误地检查了A1A1A1格式的加拿大邮政编码。 常见的错别字是资本O而不是第2,4或6位的零,应该用零替换。
我对正则表达式来说相当新,而且这个让我很难过。 非常感谢!
答案 0 :(得分:4)
你可以做到
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
答案 1 :(得分:2)
如果格式始终如此,您可以使用gsub
来替换错误的&#34; O&#34;字符。
x <- c('A1A1A1', 'AOAOAO', 'A0B0CO', 'AOBOC0')
gsub('[A-Z]\\KO', '0', x, perl=T)
# [1] "A1A1A1" "A0A0A0" "A0B0C0" "A0B0C0"
答案 2 :(得分:2)
1)使用gsubfn
,我们可以使用特别简单的正则表达式来完成此操作。请注意,gsubfn
允许使用公式表示法指定第二个参数中的函数。在此,它被视为x
和y
与指定正文的函数:
library(gsubfn)
gsubfn("(.)(.)", ~ paste0(x, chartr("O", "0", y)), "O0OO1A")
## [1] "O0O01A"
请注意,这适用于位置,并且不依赖于数字位置为字母之前的位置,因此即使先前的字母被错误地编码为数字,例如它也可以工作。哦,为零。
2)以上很容易推广将偶数位置的零转换为零,将奇数位置的零转换为0。正则表达式保持不变,只有第二个参数中指定的函数发生变化:
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))
答案 3 :(得分:0)
在gsub函数中使用以下正则表达式,然后将所有匹配的字符替换为0
(?<=^.)O|(?<=^.{3})O|(?<=^.{5})O
或强>
您可以使用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"