簡體   English   中英

R regex只在特定的字符串位置選擇性地替換字符

[英]R regex to selectively replace characters only at specific string positions

我正在以A1A1A1格式檢查加拿大郵政編碼。 常見的拼寫錯誤是資本O而不是位置2,4或6中的零,應該用零替換。

我對正則表達式很新,這個讓我很難過。 非常感謝!

你可以做

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

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

一點解釋:

  • [AZ]是從AZ任何字符
  • 圓括號([AZ])用於捕獲字符,因此在替換中可以引用它作為\\\\1
  • ([AZ])O是從AZ的字符,后跟O
  • \\\\1是從AZ的捕獲角色
  • \\\\10是捕獲的字符后跟0

如果格式始終如此,您可以使用gsub替換錯誤的“O”字符。

x <- c('A1A1A1', 'AOAOAO', 'A0B0CO', 'AOBOC0')
gsub('[A-Z]\\KO', '0', x, perl=T)
# [1] "A1A1A1" "A0A0A0" "A0B0C0" "A0B0C0"

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))

在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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM