необходимо улучшить извлечение номера телефона R regex с 26 до 28 различных форматов - PullRequest
0 голосов
/ 04 марта 2019

Я пытаюсь извлечь из случайного текста телефонные номера в 28 различных форматах в R. Я читал предыдущие посты здесь о регулярном выражении R, такие как замена \ на \\ и запуск оператора регулярного выражения с perl=TRUE, поэтому я решил большинство своих проблем.Мне нужна помощь с некоторой отладкой.

Я использую следующее регулярное выражение в R:

medium_regex2 = "(?:\\+?(\\d{1})?-?\\(?(\\d{3})\\)?[\\s-\\.]?)?(\\d{3})[\\s-\\.]?(\\d{4})[\\s-\\.]?"

и запускаю следующий код:

medium_phone_extract2 <- function(string){
  unlist(regmatches(string,gregexpr(medium_regex2,string, perl=TRUE)))
}
medium_phone_extract2(phonenumbers)

Выражение пятна 26из 28 номеров правильно.2 пропущенных числовых формата: «+ 90-555-4443322» «+1.517.3002010»

Как бы вы улучшили регулярное выражение, чтобы эти 2 формата также были правильно извлечены?

edit: полные 28 форматов, которые я пытаюсь извлечь:

phonenumbers <- c("05554443322",
                  "0555 444 3322",
                  "0555 444 33 22",
                  "5554443322", 
                  "555 444 3322",
                  "555 444 33 22",
                  "905554443322",
                  "+905554443322",
                  "+90-555-4443322",
                  "+1-517-3002010",
                  "+1-(800)-3002010",
                  "+1-517-3002010",
                  "+1.517.3002010",
                  "000-000-0000",
                  "000 000 0000",
                  "000.000.0000",
                  "(000)000-0000",
                  "(000)000 0000",
                  "(000)000.0000",
                  "(000) 000-0000",
                  "(000) 000 0000",
                  "(000) 000.0000",
                  "000-0000",
                  "000 0000",
                  "000.0000",
                  "0000000",
                  "0000000000",
                  "(000)0000000")
howmany_numbers <- length(phonenumbers)
#28

И 26, которые я могу извлечь с помощью регулярного выражения:

 [1] "05554443322"      "0555 444 3322"    "5554443322"       "555 444 3322"     "90555444332"     
 [6] "+90555444332"     "0-555-4443322"    "+1-517-3002010"   "+1-(800)-3002010" "+1-517-3002010"  
[11] "517.3002010"      "000-000-0000"     "000 000 0000"     "000.000.0000"     "(000)000-0000"   
[16] "(000)000 0000"    "(000)000.0000"    "(000) 000-0000"   "(000) 000 0000"   "(000) 000.0000"  
[21] "000-0000"         "000 0000"         "000.0000"         "0000000"          "0000000000"      
[26] "(000)0000000" 

1 Ответ

0 голосов
/ 04 марта 2019

Вы можете использовать следующее регулярное выражение:

(?:\+?\d{0,3}-?\(?[\s.-]?\d{3}\)?[\s.-]?)?\d{3}[\s.-]?\d{2}\s?\d{2}

В случае, если вы хотите сопоставить его только тогда, когда его нет в других цифрах, вы можете добавить (?<!\d) / (?!\d) обходных путей, которые предотвращают совпадение, если естьэто цифра слева или справа:

(?<!\d)(?:\+?\d{0,3}-?\(?[\s.-]?\d{3}\)?[\s.-]?)?\d{3}[\s.-]?\d{2}\s?\d{2}(?!\d)

Чтобы обеспечить обычную границу слова с обеих сторон, используйте

(?<!\w)(?:\+?\d{0,3}-?\(?[\s.-]?\d{3}\)?[\s.-]?)?\d{3}[\s.-]?\d{2}\s?\d{2}\b

В R не забудьте удвоить все обратные слеши в строкелитерал:

regex <- "(?<!\\w)(?:\\+?\\d{0,3}-?\\(?[\\s.-]?\\d{3}\\)?[\\s.-]?)?\\d{3}[\\s.-]?\\d{2}\\s?\\d{2}\\b"

Основные точки :

  • ((\\d{1})?|(\\d{2})?|(\\d{3}))? лучше записать как \d{0,3}, шаблон от нуля до трех цифр (чередование делает процесс сопоставленияболее ресурсоемкий по сравнению с более линейным, прямолинейным шаблоном)
  • [\\s.-] предпочтительнее [\\s\\-\\.], поскольку дефис лучше помещать в конце класса символов (нет необходимости избегать его там)и обратите внимание, что . всегда совпадает с литералом . внутри класса символов
  • (\\d{4}|\\d{2}\\s\\d{2}) может и должен быть переписан как \\d{2}\\s?\\d{2}, совпадая с 2 цифрами, за которыми следует дополнительный пробел, а затем 2 цифры.
  • Не уверен, что выМы хотим сопоставить пробел, дефис или точку в конце шаблона, поэтому я предлагаю удалить [\\s-\\.]? в конце.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...