Как использовать регулярные выражения для разделения пробелов в номере телефона? - PullRequest
0 голосов
/ 11 марта 2019

У меня есть 3 телефонных номера в разных форматах.

(123) 456 7890

234-567-9999

345  569 2411 # notice there are two spaces after 345

Мне нужно найти только цифры и игнорировать пробелы и скобки.Мне нужен этот вывод xxx-xxx-xxxx в словаре.

До сих пор я пробовал это:

if re.search('\d{3}.*\d{3}.*\d{4}', line):

    Phone = re.findall('\d{3}.*\d{3}.*\d{4}', line)

    Phone = ''.join(Phone)

    PhoneLst.append(Phone)

Ответы [ 3 ]

0 голосов
/ 11 марта 2019

Вы можете использовать re.findall с шаблоном, который соответствует только числам:

PhoneLst.append(''.join(re.findall(r'\d+', line)))
0 голосов
/ 11 марта 2019

Вот еще один ответ, который использует понимание списка.

import re

# List of possible phone numbers
possible_numbers = ['(123) 456 7890', '234-567-9999', '345 569 2411']

# Use list comprehension to look for phone number pattern
# numbers is a list
numbers = [n for n in possible_numbers if re.search('(\d{3}.*\d{3}.*\d{3})', n)]

# Use list comprehension to reformat the numbers based on your requirements 
# formatted_number is a list
formatted_number = [(re.sub('\s', '-', x.replace('(','').replace(')',''))) for x in numbers]

# You mentioned in your question that you needed the outout in a dictionary.
# This code will convert the formatted_number list to a dictionary.
phoneNumbersDictionary = {i : formatted_number[i] for i in range(0, len(formatted_number))}

print (phoneNumbersDictionary)
# output
{0: '123-456-7890', 1: '234-567-9999', 2: '345-569-2411'}
0 голосов
/ 11 марта 2019

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

Чтобы исправить этовы должны соответствовать только группы цифр.Вы можете сделать это, используя группы захвата и используя одну для каждой группы цифр, т.е. [3] - [3] - [4].

Например:

phone_list = []
lines = ["(123) 456 7890", "234-567-9999", "345 569 2411"]

for line in lines:
    re_match = re.search("(\d{3}).*(\d{3}).*(\d{4})", line)

    if re_match:
        formatted_number = "".join(re_match.groups())
        phone_list.append(formatted_number)

С результатом дляphone_list:

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