R regex只在特定的字符串位置选择性地替换字符

时间:2014-12-03 02:15:40

标签: regex r

我错误地检查了A1A1A1格式的加拿大邮政编码。 常见的错别字是资本O而不是第2,4或6位的零,应该用零替换。

我对正则表达式来说相当新,而且这个让我很难过。 非常感谢!

4 个答案:

答案 0 :(得分:4)

你可以做到

x <- c("A0A0A0", "AOB0C0", "A0BOC0", "A0B0CO", "OOOOOO")

gsub("([A-Z])O", "\\10", x)
# [1] "A0A0A0" "A0B0C0" "A0B0C0" "A0B0C0" "O0O0O0"

一点解释:

  • [A-Z]AZ
  • 中的任何字符
  • 括号([A-Z])用于捕获角色,因此可以在替换中将其引用为\\1
  • ([A-Z])O是从AZ的字符,后跟O
  • \\1是从AZ
  • 捕获的角色
  • \\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允许使用公式表示法指定第二个参数中的函数。在此,它被视为xy与指定正文的函数:

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

DEMO

您可以使用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"

DEMO