Regex: сопоставить один шаблон и исключить другой - PullRequest
2 голосов
/ 24 апреля 2020

У меня есть регулярное выражение, соответствующее телефонным номерам:

import re
phones = re.findall(r'[+(]?[0-9][0-9 \-()]{8,}[0-9]', text)

Показывает хорошую точность в большом наборе необработанных текстов.

Но иногда оно соответствует нежелательным результатам (в диапазоне лет и случайные идентификаторы).

Диапазоны лет:

'2012 - 2017'
'(2011 - 2013'
'1999                                                   02224'
'2019     2010-2015'
'2018-2018 (5'
'2004 -2009'
'1) 2005-2006'
'2011            2020'

Случайные идентификаторы:

'5                    5                    5                 5'
'100032479008252'
'100006711277302'

У меня есть идеи, как решить эти проблемы.

  1. Ограничить общее количество цифр до 12 цифр.
  2. Ограничить общее количество символов до 16 символов.
  3. Удалить диапазоны лет (19**|20** - 19**|20**).

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

Некоторые примеры, которые регулярное выражение должно уловить, представлены ниже:

380-956-425979
+38(097)877-43-88
+38(050) 284-24-20
(097) 261-60-52
380-956-425979
(068)1850063
0975533222

Ответы [ 2 ]

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

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

import re
test = '''380-956-425979
+38(097)877-43-88
+38(050) 284-24-20
(097) 261-60-52
380-956-425979
(068)1850063
0975533222'''
solution = test.split("\n")

p1 = "\+?\d{3}\-\d{3}\-\d{6}"
p2 = "\+?(?:\d{2})?\(\d{3}\) ?\d{3}\-\d{2}\-\d{2}"
p3 = "\+?\d{3}\-\d{3}\-\d{6}"
p4 = "\+?(?:\(\d{3}\)|\d{3})\d{7}"

result = re.findall(f'{p1}|{p2}|{p3}|{p4}', test)
print(solution)
print(result)
0 голосов
/ 24 апреля 2020

Вы можете сделать это в python напрямую:

if regex.match("condition", "teststring") and not regex.match("not-condition", "teststring"):
   print("Match!")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...