Найти номера телефонов в скрипте Python

Следующий скрипт на 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 = [email protected]
r = re.compile(r'(\b[\w.][email protected]+[\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+))?
 Tim McNamara06 окт. 2010 г., 02:59
У вас есть регулярные выражения для телефонных номеров, чтобы мы могли их критиковать?
 Aaron06 окт. 2010 г., 05:23
Вы правы, похоже, кто-то опубликовал что-то, что должно работать. В любом случае, кто-то может описать, как это работает? Я разместил это ниже начального выше. Как я смогу добавить это в свое регулярное выражение для адресов электронной почты? Спасибо еще раз за помощь
 Aaron06 окт. 2010 г., 03:26
Я только добавил к своему сообщению, что у меня есть для телефонных номеров. Трудно обнаружить 7 или 10-значные числа, у которых нет дефисов.
 John Machin06 окт. 2010 г., 04:04
Всего одна "страна" / система или всемирная? Вам нужно различать сотовый / мобильный и стационарный телефон? Вам нужно различать специальные номера, такие как 800 номеров? Возможный + <"код страны" префикс?
 Aaron06 окт. 2010 г., 04:08
Я надеялся сделать это относительно простым. Так что не беспокойтесь о коде страны. Он должен иметь возможность принимать коды городов с круглыми скобками или без них. Или просто 7 цифр тоже. Не должно быть различия между числами, такими как 800 чисел.
 BoltBait06 окт. 2010 г., 02:38
 Daniel Vandersluis06 окт. 2010 г., 04:56

Ответы на вопрос(7)

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

re.findall( r'[697]\d{1,2}.\d{2,3}.\d{2,3}.\d{0,2}',str)

Ты можешь проверить :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,'] добавить больше примеров, чтобы получить точность

 Sarang26 сент. 2018 г., 10:16
не на простой номер "4441234567"
 J. Doe26 сент. 2018 г., 10:47
Решение было бы лучше с большим количеством примеров (15 слишком мало)

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

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}"

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

Во-первых, нам нужно сопоставить код города (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)

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

re.findall("[(][\d]{3}[)][ ]?[\d]{3}-[\d]{4}", lines)
Решение Вопроса

Если вы заинтересованы в изучении Regex, вы можете попробовать написать его самостоятельно. Это не так сложно, как задумано. Сайты какRegexPal Позволяет вам ввести некоторые тестовые данные, а затем написать и протестировать регулярное выражение для этих данных. Используя RegexPal, попробуйте добавить несколько телефонных номеров в различных форматах, которые вы ожидаете найти (с помощью скобок, кодов городов и т. Д.), Возьмите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
 Frank31 июл. 2016 г., 01:51
соответствует нелатинским символам ٠٧٧٠١٣٥٥٥٥
 Aaron06 окт. 2010 г., 05:49
Это выглядит действительно здорово. Я только что провел некоторое тестирование и, похоже, работает очень хорошо. Мой единственный вопрос, как реализовать это, чтобы он мог работать с моими существующими адресами электронной почты? Есть ли способ сделать это, что не слишком много работы? еще раз спасибо
 Frank31 июл. 2016 г., 02:02
Используйте флаг re.A, если вы используете python3 и хотите избежать использования нелатинского юникода
 PLPeeters15 февр. 2017 г., 15:57
Учитывая, что это первый результат поиска в Google, я думаю, что необходимо указать, что теперь естьтелефонные номера Модуль, который может сделать это.
 oybek.t28 июл. 2017 г., 19:10
@Auguste, как бы я соответствовал символам эмодзи между числами? скажем, у меня есть 123emoji345emoji4444, и я хотел бы получить 1233454444
 Auguste06 окт. 2010 г., 06:22
Вы должны быть в состоянии реализовать это подобно тому, как Regex электронной почты уже реализован; Попробуйте изменить копию# regex = [email protected] блок. Я бы сделал снимок, но я никогда раньше не трогал Питона. Вы просто хотите найти совпадения с номером телефона Regex в файле, который вы открыли, и вывести их наresult.txt.
 Auguste10 окт. 2010 г., 07:09
Эй, каков статус твоего проекта? Вы реализовали это?
 Auguste06 окт. 2010 г., 04:54
@ Аарон, я попытался изменить Regex, который ты дал, чтобы решить твою проблему. Это включено в мой ответ, который я редактировал. Попробуйте и посмотрите, работает ли он.
 Aaron06 окт. 2010 г., 03:25
Спасибо, я нашел RegexPal довольно полезным. Я добавил в свой пост и включил то, что у меня пока есть, для телефонных номеров. Что-то, с чем я сталкиваюсь с трудностями, это обнаружение семизначных или десятизначных чисел, у которых вообще нет дефисов.

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

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

Ваш ответ на вопрос