Python Regex для телефонных номеров действует странно - PullRequest
1 голос
/ 30 апреля 2020

Я разработал Python регулярное выражение, которое получает телефонные номера из текста примерно в 90% случаев. Однако иногда случаются странные аномалии. Мой код выглядит следующим образом:

phone_pattern = re.compile(r'(\d{3}[-\.\s]\d{3}[-\.\s]\d{4}|\(\d{3}\)\s*\d{3}[-\.\s]\d{4}|\d{3}[-\.\s]\d{4})')
df['phone'] = df['text'].apply(lambda x: phone_pattern.findall(x))
df['phone']=df['phone'].apply(lambda y: '' if len(y)==0 else y)
df['phone'] = df['phone'].apply(', '.join)

Этот код извлекает номера телефонов и добавляет новый столбец под названием «телефон». Если число несколько, они разделяются запятой.

Следующий текст, однако, генерирует странный вывод:

university of blah school of blah blah blah (jane doe doe) 1234567890 1234 miller Dr E233 MILLER DR blah blah fl zipcode in the morning or maybe Monday.

Вывод, который мне дает мой текущий код:

890 1234

Вместо требуемого фактического числа из:

1234567890

Это происходит на нескольких примерах. Я пытался редактировать регулярное выражение, но это только ухудшает его. Любая помощь будет оценена. Кроме того, я думаю, что этот вопрос полезен, потому что многие телефонные регулярные выражения, предлагаемые в Stackoverflow, не сработали для меня.

1 Ответ

1 голос
/ 30 апреля 2020

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

(\b\d{3}[-.\s]?\d{3}[-.\s]?\d{4}|\(\d{3}\)\s*\d{3}[-.\s]\d{4}|\b\d{3}[-.\s]\d{4})\b

См. Демонстрацию regex

Обратите внимание, что \b граница слова добавляется перед первой и третьей только альтернативами, вторая каждый начинается с шаблона \(, который соответствует ( и не требует проверки границы слова. В конце тоже есть граница слова. Кроме того, разделитель [-.\s] в первой альтернативе сделан необязательным, квантификатор ? позволяет ему соответствовать 1 или 0 раз.

В Pandas, просто используйте

rx = r'(\b\d{3}[-.\s]?\d{3}[-.\s]?\d{4}|\(\d{3}\)\s*\d{3}[-.\s]\d{4}|\b\d{3}[-.\s]\d{4})\b'
df['phone'] = df['text'].str.findall(rx).apply(', '.join)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...