grep и regrex для телефонных номеров R - PullRequest
0 голосов
/ 11 февраля 2019

Я хотел бы получить номера телефонов из файла.Я знаю, что числа имеют разные формы, я не знаю, как кодировать для каждой формы.Использование grep и regrexpr в R. Числа записываются в следующем виде:

xxx-xxx-xxxx, (xxx) xxx-xxxx, xxx xxx xxxx, xxx.xxx.xxxx

1 Ответ

0 голосов
/ 11 февраля 2019

Попробуйте это:

phones <- c("foo 111-111-1111 bar" , "(111)111-1111 quux", "who knows 111 111 1111", "111.111.1111 I do", "111)111-1111 should not work", "1111111111 ditto", "a 111-111-1111 b (222)222-2222 c")
re <- gregexpr("(\\(\\d{3}\\)|\\d{3}[-. ])\\d{3}[-. ]\\d{4}", phones)
regmatches(phones, re)
# [[1]]
# [1] "111-111-1111"
# [[2]]
# [1] "(111)111-1111"
# [[3]]
# [1] "111 111 1111"
# [[4]]
# [1] "111.111.1111"
# [[5]]
# character(0)
# [[6]]
# character(0)
# [[7]]
# [1] "111-111-1111"  "(222)222-2222"

В данных я приведу несколько примеров с другим текстом на обеих сторонах и на обеих сторонах, а также два примера, которые не должны совпадать.(То есть: начальный «тестовый набор», так как вы хотите убедиться, что вы соответствуете как хорошим, так и плохим примерам.) Последний надеется сопоставить несколько чисел в одной строке / предложении.

gregexpr и regmatches полезны для поиска и извлечения или замены регулярных выражений в строках 1+.Для примера «замены» можно сделать:

regmatches(phones, re) <- "GONE!"
phones
# [1] "foo GONE! bar"                "GONE! quux"                  
# [3] "who knows GONE!"              "GONE! I do"                  
# [5] "111)111-1111 should not work" "1111111111 ditto"            
# [7] "a GONE! b GONE! c"           

Очевидно, искусственная замена, но, безусловно, пригодная для использования.Обратите внимание, что regmatches работает с побочным эффектом , что означает, что он изменил вектор phones вместо того, чтобы возвращать значение.Можно заставить работать , а не с побочным эффектом, но это немного менее интуитивно понятно:

phones # I reset it to the original value
# [1] "foo 111-111-1111 bar"             "(111)111-1111 quux"              
# [3] "who knows 111 111 1111"           "111.111.1111 I do"               
# [5] "111)111-1111 should not work"     "1111111111 ditto"                
# [7] "a 111-111-1111 b (222)222-2222 c"
`regmatches<-`(phones, re, value = "GONE!")
# [1] "foo GONE! bar"                "GONE! quux"                  
# [3] "who knows GONE!"              "GONE! I do"                  
# [5] "111)111-1111 should not work" "1111111111 ditto"            
# [7] "a GONE! b GONE! c"           
phones
# [1] "foo 111-111-1111 bar"             "(111)111-1111 quux"              
# [3] "who knows 111 111 1111"           "111.111.1111 I do"               
# [5] "111)111-1111 should not work"     "1111111111 ditto"                
# [7] "a 111-111-1111 b (222)222-2222 c"

Редактировать : scope-creep.

out <- unlist(Filter(length, regmatches(phones, re)))
out
# [1] "111-111-1111"  "(111)111-1111" "111 111 1111"  "111.111.1111"  "111-111-1111" 
# [6] "(222)222-2222"
gsub("[^0-9]", "", out)
# [1] "1111111111" "1111111111" "1111111111" "1111111111" "1111111111" "2222222222"
out <- gsub("[^0-9]", "", out)
sprintf("(%s)%s-%s", substr(out, 1, 3), substr(out, 4, 6), substr(out, 7, 10))
# [1] "(111)111-1111" "(111)111-1111" "(111)111-1111" "(111)111-1111" "(111)111-1111"
# [6] "(222)222-2222"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...