Найти номера телефонов в скрипте Python - PullRequest
19 голосов
/ 06 октября 2010

следующий скрипт на python позволяет мне удалять адреса электронной почты из заданного файла с помощью регулярных выражений.

Как я могу добавить к этому, чтобы я мог также получить номера телефонов? Скажите, если это было 7 или 10 цифр (с кодом города), а также учитывать скобки?

Мой текущий скрипт можно найти ниже:

# filename variables
filename = 'file.txt'
newfilename = 'result.txt'

# read the file
if os.path.exists(filename):
        data = open(filename,'r')
        bulkemails = data.read()
else:
        print "File not found."
        raise SystemExit

# regex = something@whatever.xxx
r = re.compile(r'(\b[\w.]+@+[\w.]+.+[\w.]\b)')
results = r.findall(bulkemails)
emails = ""
for x in results:
        emails += str(x)+"\n"

# function to write file
def writefile():
        f = open(newfilename, 'w')
        f.write(emails)
        f.close()
        print "File written."

Regex для телефонных номеров:

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

Еще одно регулярное выражение для телефонных номеров:

(?:(?:\+?1\s*(?:[.-]\s*)?)?(?:\(\s*([2-9]1[02-9]|[2-9][02-8]1|[2-9][02-8][02-9])\s*\)|([2-9]1[02-9]|[2-9][02-8]1|[2-9][02-8][02-9]))\s*(?:[.-]\s*)?)?([2-9]1[02-9]|[2-9][02-9]1|[2-9][02-9]{2})\s*(?:[.-]\s*)?([0-9]{4})(?:\s*(?:#|x\.?|ext\.?|extension)\s*(\d+))?

Ответы [ 7 ]

34 голосов
/ 06 октября 2010

Если вы заинтересованы в изучении Regex, вы можете попробовать написать его самостоятельно. Это не так сложно, как задумано. Такие сайты, как RegexPal , позволяют вам вводить некоторые тестовые данные, а затем записывать и тестировать регулярные выражения для этих данных. Используя RegexPal, попробуйте добавить несколько телефонных номеров в различных форматах, которые вы ожидаете найти (с помощью скобок, кодов городов и т. Д.), Возьмите Regex cheatsheet и посмотрите, как далеко вы сможете добраться. Если ничего другого, это поможет в чтении выражений других людей.

Edit: Вот модифицированная версия вашего Regex, которая также должна соответствовать 7- и 10-значным телефонным номерам, в которых отсутствуют дефисы, пробелы или точки. Я добавил вопросительные знаки после классов символов ([]), что делает что-либо в них необязательным. Я протестировал его в RegexPal, но, поскольку я все еще изучаю Regex, я не уверен, что он идеален. Попробуйте.

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

Соответствует следующим значениям в RegexPal:

000-000-0000
000 000 0000
000.000.0000

(000)000-0000
(000)000 0000
(000)000.0000
(000) 000-0000
(000) 000 0000
(000) 000.0000

000-0000
000 0000
000.0000

0000000
0000000000
(000)0000000
16 голосов
/ 10 декабря 2013

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

Сначала нам нужно сопоставить код города (3 цифры), транк (3 цифры) идобавочный номер (4 цифры):

reg = re.compile("\d{3}\d{3}\d{4}")

Теперь мы хотим захватить соответствующий номер телефона, поэтому добавляем скобки вокруг частей, которые нам интересны (все):

reg = re.compile("(\d{3}\d{3}\d{4})")

Код города, транк и расширение могут быть разделены до 3 символов, которые не являются цифрами (например, в случае использования пробелов вместе с разделителем дефиса / точки):

reg = re.compile("(\d{3}\D{0,3}\d{3}\D{0,3}\d{4})")

Теперь телефонный номер может фактически начинаться с символа ( (если код города заключен в круглые скобки):

reg = re.compile("(\(?\d{3}\D{0,3}\d{3}\D{0,3}\d{4}).*?")

Теперь этот телефонный номер, вероятно, встроен в кучу другого текста.:

reg = re.compile(".*?(\(?\d{3}\D{0,3}\d{3}\D{0,3}\d{4}).*?")

Теперь этот другой текст может содержать новые строки:

reg = re.compile(".*?(\(?\d{3}\D{0,3}\d{3}\D{0,3}\d{4}).*?", re.S)

Наслаждайтесь!

Я лично остановлюсь здесь, но если выочень хочется убедиться, что в качестве разделителей используются только пробелы, дефисы и точкиВы можете попробовать следующее (не проверено):

reg = re.compile(".*?(\(?\d{3})? ?[\.-]? ?\d{3} ?[\.-]? ?\d{4}).*?", re.S)
7 голосов
/ 04 марта 2015

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

re.findall("[(][\d]{3}[)][ ]?[\d]{3}-[\d]{4}", lines)
1 голос
/ 10 ноября 2016

Для испанских телефонных номеров я использую это с большим успехом:

re.findall( r'[697]\d{1,2}.\d{2,3}.\d{2,3}.\d{0,2}',str)
0 голосов
/ 13 октября 2018

Поскольку никто не опубликовал это регулярное выражение, я буду.Это то, что я использую, чтобы найти номера телефонов.Он соответствует всем обычным форматам телефонных номеров, которые вы видите в Соединенных Штатах.Мне не нужно было это регулярное выражение для сопоставления с международными номерами, поэтому я не вносил поправки в регулярное выражение для этой цели.

phone_number_regex_pattern = r"\(?\d{3}\)?[-.\s]\d{3}[-.\s]\d{4}"

Используйте этот шаблон, если вы хотите, чтобы простые телефонные номера без символов между ними соответствовали.Примером этого может быть: "4441234567".

phone_number_regex_pattern = r"\(?\d{3}\)?[-.\s]?\d{3}[-.\s]?\d{4}"
0 голосов
/ 23 ноября 2017

Вы можете проверить: http://regex.inginf.units.it/. С некоторыми тренировочными данными и целью, он создаст вам соответствующее регулярное выражение. Это не всегда идеально (проверьте F-оценка). Давайте попробуем это с 15 примерами:

re.findall("\w\d \w\w \w\w \w\w \w\d|(?<=[^\d][^_][^_] )[^_]\d[^ ]\d[^ ][^ ]+|(?<= [^<]\w\w \w\w[^:]\w[^_][^ ][^,][^_] )(?: *[^<]\d+)+",  
           """Lorem ipsum ©  04-42-00-00-00 dolor 1901 sit amet, consectetur +33 (0)4 42 00 00 00 adipisicing elit. 2016 Sapiente dicta fugit fugiat hic 04 42 00 00 00 aliquam itaque 04.42.00.00.00 facere, 13205 number: 100 000 000 00013 soluta. 4 Totam id dolores!""")

возвращает ['04 42 00 00 00', '04.42.00.00.00', '04-42-00-00-00', '50498,'] добавить больше примеров, чтобы получить точность

0 голосов
/ 06 октября 2010

Dive Into Python имеет конкретный пример того, что вы ищете здесь:

http://www.diveintopython.net/regular_expressions/phone_numbers.html

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