Извлечь все телефонные номера во всех форматах из строки R - PullRequest
2 голосов
/ 04 мая 2019

Я пытаюсь извлечь номера телефонов во всех форматах (международных и других) в R.

Пример данных:

phonenum_txt <- "sDlkjazsdklzdjsdasz+49 123 999dszDLJhfadslkjhds0001 123.456sL:hdLKJDHS+31 (0) 8123zsKJHSDlkhzs&^#%Q(999)9999999adlfkhjsflj(999)999-9999sDLKO*$^9999999999adf;jhklslFjafhd9999999999999zdlfjx,hafdsifgsiaUDSahj"

Я бы хотел:

extract_vector
[1] "+49 123 999"
[2] 0001 123.456
[3] "+31 (0) 8123"
[4] (999)9999999
[5] (999)999-9999
[6] 9999999999
[7] 9999999999999

Я пытался использовать:

extract_vector <- str_extract_all(phonenum_txt,"^(?:\\+\\d{1,3}|0\\d{1,3}|00\\d{1,2})?(?:\\s?\\(\\d+\\))?(?:[-\\/\\s.]|\\d)+$")

, который я получил от ЗДЕСЬ , но мои навыки регулярных выражений недостаточно хороши, чтобы преобразовать его, чтобы он работал в R.

Спасибо!

Ответы [ 2 ]

2 голосов
/ 04 мая 2019

Хотя ваши данные не кажутся реалистичными, это выражение может помочь вам создать желаемое выражение, соответствующее вашей строке.

(?=.+[0-9]{2,})([0-9+\.\-\(\)\s]+)

Я добавил дополнительную границу, которую обычно полезно добавлять, когда входные данные являются сложными.

enter image description here

Вы можете добавлять или удалять границы, если хотите.Например, это выражение может также работать:

([0-9+\.\-\(\)\s]+)

Или вы можете добавить к нему дополнительные левую и правую границы, например, если все номера телефонов заключены в прописные / строчные буквы:

[a-z]([0-9+\.\-\(\)\s]+)[a-z]

Вы можете просто вызвать желаемый целевой выход, который находится в группе захвата, используя $1.

enter image description here

Дизайн регулярных выражений работает лучше всего, если / когда есть реальные данные.

1 голос
/ 04 мая 2019

Вы можете использовать это регулярное выражение для сопоставления и извлечения всех телефонных номеров, которые есть в вашей строке.

(?: *[-+().]? *\d){6,14}

Идея, лежащая в основе этого регулярного выражения, состоит в том, чтобы по желанию разрешить один символ из этого набора [-+().] (так как эти символы могут появляться в вашем телефонном номере) перед одной цифрой в вашем телефонном номере. Если ваш телефонный номер может содержать больше символов, таких как { или } или [ или ], вы можете добавить их в этот набор символов. И этот необязательный набор символов может быть окружен необязательными пробелами, поэтому у нас есть пробел до и после этого набора символов, и в конце у нас есть \d для сопоставления его с числом, и весь этот образец количественно {6,14} по крайней мере появляются 6 или макс. появляются 14 раз (вы можете настроить эти номера в соответствии с вашими потребностями), так как минимальное число в номере телефона согласно вашим образцам данных равно 6 (хотя на самом деле я думаю, что это 7 или 8 в Сингапуре, но это вверх Вам)

Regex Demo

Демоверсия кода R

library(stringr)
str_match_all("sDlkjazsdklzdjsdasz+49 123 999dszDLJhfadslkjhds0001 123.456sL:hdLKJDHS+31 (0) 8123zsKJHSDlkhzs&^#%Q(999)9999999adlfkhjsflj(999)999-9999sDLKO*$^9999999999adf;jhklslFjafhd9999999999999zdlfjx,hafdsifgsiaUDSahj", "(?: *[-+().]? *\\d){6,14}")

Печатает все необходимые номера,

[[1]]
     [,1]           
[1,] "+49 123 999"  
[2,] "0001 123.456" 
[3,] "+31 (0) 8123" 
[4,] "(999)9999999" 
[5,] "(999)999-9999"
[6,] "9999999999"   
[7,] "9999999999999"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...