我的原始資料有很多個人資訊,所以我在 R 中屏蔽了它們。示例資料和我的原始代碼如下:
install.packages("stringr")
library(string)
x = c("010-1234-5678",
"John 010-8888-8888",
"Phone: 010-1111-2222",
"Peter 018.1111.3333",
"Year(2007,2019,2020)",
"Alice 01077776666")
df = data.frame(
phoneNumber = x
)
pattern1 = "\\d{3}-\\d{4}-\\d{4}"
pattern2 = "\\d{3}.\\d{4}.\\d{4}"
pattern3 = "\\d{11}"
delPhoneList1 <- str_match_all(df, pattern1) %>% unlist
delPhoneList2 <- str_match_all(df, pattern2) %>% unlist
delPhoneList3 <- str_match_all(df, pattern3) %>% unlist
我從資料集中發現了三種型別的模式,每個結果如下:
> delPhoneList1
[1] "010-1234-5678" "010-8888-8888" "010-1111-2222"
> delPhoneList2
[1] "010-1234-5678" "010-8888-8888" "010-1111-2222" "018.1111.3333" "007,2019,2020"
> delPhoneList3
[1] "01077776666"
Pattern1 是我所在國家/地區使用破折號的典型電話號碼型別,但有人使用逗號鍵入像 pattern2 這樣的號碼。但是,pattern2 還包括pattern1,因此它會檢測其他模式,如一系列年份。這是一個意想不到的結果。
我的問題是如何匹配我定義的確切模式。模式 2 包括過多的模式,例如"007,2019,2020"from "Year(2007,2019,2020)"。
此外,下一步是使用以下代碼屏蔽數字:
for (phone in delPhoneList1) {
df$phoneNumber <- gsub(phone, "010-9999-9999", df$phoneNumber)
}
我認為代碼對我來說是完美的,但是如果您有更有效的方法,請告訴我。
謝謝。
uj5u.com熱心網友回復:
一種模式來統治他們;-)
ptn <- "\\b\\d{3}([-.]?)\\d{4}\\1\\d{4}\\b"
grepl(ptn, x)
# [1] TRUE TRUE TRUE TRUE FALSE TRUE
您
pattern2失敗的原因是因為它用作.分隔符,但在正則運算式中這意味著“任何字符”。你可以使用\\.代替,.它會表現得更好。我在這里使用占位符:如果第一個分隔符是 a
-,則\\1確保另一個分隔符相同。如果它是空的,那么第二個也是空的。這也允許 11 個不間斷的數字pattern3。該
\\b是字邊界,向我們保證12位將不會匹配:grepl(ptn, c("12345678901", "123456789012")) # [1] TRUE FALSE
由于它有一個占位符,它往往會弄亂stringr::函式,但我們可以解決這個問題,具體取決于您的需要。
例如,如果您用相同模式的第二個實體替換占位符,它可能允許123-4444.5555(混合分隔符),如果這不是問題的話。
ptn2 <- "\\b\\d{3}[-.]?\\d{4}[-.]?\\d{4}\\b"
unlist(str_match_all(x, ptn2))
# [1] "010-1234-5678" "010-8888-8888" "010-1111-2222" "018.1111.3333" "01077776666"
或者我們可以利用匹配的模式數量(原始ptn):
unlist(str_match(x, ptn)[,1])
# [1] "010-1234-5678" "010-8888-8888" "010-1111-2222" "018.1111.3333" NA "01077776666"
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/397787.html
