Решите, какие форматы вы хотите распознать, затем создайте регулярное выражение, соответствующее каждому из них, сгруппировав разные части номера (например, код города, префикс и т. Д.). Наконец, используйте подстановку для создания желаемого канонического вывода.
Пример:
, чтобы соответствовать
xxx-xxx-xxxx -> \d{3}-\d{3}-\d{4}
(xxx) xxx-xxxx -> \(\d{3}\) \d{3}-\d{4}
1-xxx-xxx-xxx -> 1-\d{3}-\d{3}-\d{4}
При этом игнорируются правила, ограничивающие префикс и код города (в США не разрешается использование кодов регионов или префиксов с 0 или 1). Вы могли бы попытаться быть очень умным и создать одно регулярное выражение, которое соответствует всем, но в итоге вы получите беспорядочный беспорядок, который невозможно изменить, вместо этого вам следует ИЛИ шаблоны вместе, чтобы их было легче модифицировать в будущем.
основная идея:
pattern = re.compile(r'\d{3}-\d{3}-\d{4}|\(\d{3}\) \d{3}-\d{4}|1-\d{3}-\d{3}-\d{4}')
с добавленной группировкой для канонического вывода
pattern = re.compile(r'(\d{3})-(\d{3})-(\d{4})|\((\d{3})\) (\d{3})-(\d{4})|1-(\d{3})-(\d{3})-(\d{4})')
, затем просто запустите это для своих входов, и для каждого ввода телефонного номера у вас будет 3 подходящие группы, одна для кода города, одна для префикса и одна для суффикса, который вы можете выводить по своему усмотрению. Вам необходимо базовое понимание регулярных выражений, но оно не должно быть слишком сложным.