Python регулярное выражение для извлечения номера телефона - PullRequest
0 голосов
/ 08 апреля 2020

Я хочу очистить столбец номера телефона в моем pandas кадре данных. Я использую приведенный ниже код, но он оставляет скобку в конце. Как получить правильное регулярное выражение, чтобы исключить любые дополнительные символы в конце, например (или что-либо, что не является частью номера телефона. Я просмотрел старые сообщения, но не могу найти точное решение. Пример кода ниже:

import pandas as pd
df1 = pd.DataFrame({'x': ['1234567890', '202-456-3456', '(202)-456-3456adsd', '(202)-456- 4567', '1234564567(dads)']})
df1['x1'] = df1['x'].str.extract('([\(\)\s\d\-]+)',expand= True) 

expected output:
                    x               x1
0          1234567890       1234567890
1        202-456-3456     202-456-3456
2  (202)-456-3456adsd   (202)-456-3456
3     (202)-456- 4567  (202)-456- 4567
4    1234564567(dads)      1234564567

Current output :
                    x               x1
0          1234567890       1234567890
1        202-456-3456     202-456-3456
2  (202)-456-3456adsd   (202)-456-3456
3     (202)-456- 4567  (202)-456- 4567
4    1234564567(dads)      1234564567(

Ответы [ 3 ]

4 голосов
/ 08 апреля 2020

Вы можете использовать

((?:\(\d{3}\)|\d{3})?(?:\s|\s?-\s?)?\d{3}(?:\s|\s?-\s?)?\d{4})

См. Демоверсию regex

Подробности

  • (?:\(\d{3}\)|\d{3})? - необязательная последовательность
    • \(\d{3}\) - (, три цифры, )
    • | - или
    • \d{3} - три цифры
  • (?:\s|\s?-\s?)? - необязательная последовательность символов пробела или -, заключенная в один необязательный пробел
  • \d{3} - три цифры
  • (?:\s|\s?-\s?)? - необязательная последовательность символов пробела или -, заключенная в отдельные необязательные пробелы
  • \d{4} - четыре цифры.

Pandas тест:

>>> df1['x'].str.extract(r'((?:\(\d{3}\)|\d{3})?(?:\s|\s?-\s?)?\d{3}(?:\s|\s?-\s?)?\d{4})',expand= True)
                 0
0       1234567890
1     202-456-3456
2   (202)-456-3456
3  (202)-456- 4567
4       1234564567
2 голосов
/ 08 апреля 2020

Как насчет другого подхода? Вместо того, чтобы пытаться сопоставить номера телефонов, удалите ненужные биты:

import pandas as pd
df1 = pd.DataFrame({'x': ['1234567890', '202-456-3456', '(202)-456-3456adsd', '(202)-456- 4567', '1234564567(dads)']})
df1['x1'] = df1['x'].str.replace(r'\([^0-9]+\)|\D*$', '')

Output:
                    x               x1
0          1234567890       1234567890
1        202-456-3456     202-456-3456
2  (202)-456-3456adsd   (202)-456-3456
3     (202)-456- 4567  (202)-456- 4567
4    1234564567(dads)       1234564567

Это означает использование str.replace вместо str.extract, но я думаю, что в результате код будет проще.

Объяснение: \([^0-9]+\) соответствует любым символам, кроме 0-9 в скобках.

| означает логическое ИЛИ.

\D*$ соответствует нулю или более без нумерации c символов в конце строки.

Используется с replace, соответствует приведенному выше шаблону и заменяет его пустой строкой.

0 голосов
/ 09 апреля 2020

Я бы использовал замену.

df1['x1'] = df1['x'].str.replace(r'(?<=\(\d{3}\)[-]\d{3}[-]\d{4})[a-z]*', '')
df1

Проще говоря, заменить Y, если она находится сразу справа от X, то есть (?<+X)Y

Y = группа буквенно-цифровые символы в нижнем регистре - [a-z]*

X = три цифры между (), за которыми следует da sh \(\d{3}\)[-], за которым следует; еще три цифры и да sh \(\d{3}\)[-] и, наконец, после; четыре цифры и да sh `(\ d {4})

Выход

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...