Question: I'm error checking Canadian postal codes in the format A1A1A1.
Common typos are capital O instead of zeros in positions 2, 4 or 6, which should be replaced by a zero.

I'm fairly new to regex, and this one has me stumped.
Thanks so much!

Answer: 
You can do

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

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

```

A bit of explanation:

* `[A-Z]` is any character from `A` to `Z`
* the parentheses `([A-Z])` are here to capture the character so it can be referenced as `\\1` in the replacement
* `([A-Z])O` is a character from `A` to `Z` followed by a `O`
* `\\1` is the captured character from `A` to `Z`
* `\\10` is the captured character followed by a `0`
Use the below regex in gsub function and then replace all the matched characters with `0`

```
(?<=^.)O|(?<=^.{3})O|(?<=^.{5})O

```

[DEMO](http://regex101.com/r/oT8xB0/1)

**OR**

You could use the PCRE verb [`(*SKIP)(*F)`](https://stackoverflow.com/questions/24534782/how-do-skip-or-f-work-on-regex). This only replaces the letter `O` in 2,4,6 positions with zero `0`. It won't care about the letters or numbers present in other positions.

```
> x <- c('AOAOAO', 'O2O3O2', 'BOB1B2', 'C1COC3')
> gsub("(?:(?<=^).|(?<=^..).|(?<=^....).)(*SKIP)(*F)|O", "0", x, perl=TRUE)
[1] "A0A0A0" "O2O3O2" "B0B1B2" "C1C0C3"

```

[DEMO](http://regex101.com/r/oT8xB0/2)