#python-3.x
#python-3.x
Вопрос:
Итак, у меня есть некоторый код, в котором я буду использовать регулярное выражение.
В частности, мне нужно использовать re.findall() и одно регулярное выражение для извлечения трех имен и адресов электронной почты из «строки». Чтобы создать список из 3 кортежей следующим образом: [(‘Мэри Бо’, ‘md90@uw.com ‘), (‘Дорогой Мо Дрейк’, ‘cmd39@gmail.gbl ‘), (‘Р.Л. Фитцджери’, ‘fit.rl@hotmail.ing ‘)]
вот строка….
string = """Name: Mary Boe, Email: md90@uw.comn
Name: Cheri Moe Drake, Email: cmd39@gmail.gbln
Name: R.L. Fitzgeri, Email: fit.rl@hotmail.ing"""
До сих пор я использовал следующее, чтобы получить [‘R.L. Fitzgeri’]
с
re.findall('SSwSswSwwwwSw',string)
И я смог получить fit.rl@hotmail.ing
с
re.findall('w\w\w\SwwSwwwwSwwSwww',string)
Я смог получить Чери Мо Дрейк с
re.findall('wwwwwswwwswwwww',string)
Но я изо всех сил пытался сжать это, и, во-вторых, изо всех сил пытался получить это так, чтобы все получилось, как я уже сказал, как:
[('Mary Boe', 'md90@uw.com'), ('Cheri Moe Drake', 'cmd39@gmail.gbl'), ('R.L. Fitzgeri', 'fit.rl@hotmail.ing')]
Комментарии:
1. Является ли использование регулярного выражения ограничением? Есть более эффективные способы подойти к этому.
2. Да, blackpearl, это ограничение
Ответ №1:
Вот способ выполнить эту работу:
import re
string = """Name: Jane Doe, Email: jd12@uw.comn
Name: Sally Sue Draper, Email: ssd59@gmail.edun
Name: J.D. Salinger, Email: sal.jd@hotmail.org"""
pattern = r'Name: (. ?), Email: (. )'
result = re.findall(pattern, string)
print(result)
Вывод:
[('Jane Doe', 'jd12@uw.com'), ('Sally Sue Draper', 'ssd59@gmail.edu'), ('J.D. Salinger', 'sal.jd@hotmail.org')]
Объяснение регулярных выражений:
Name: # literally
(. ?) # group 1, 1 or more any character but newline, not greedy
, Email: # literally
(. ) # group 2, 1 or more any character but newline
Ответ №2:
Если у вас всегда один и тот же формат, возможно, имеет смысл избегать регулярных выражений в этом сценарии и подойти к проблеме альтернативно:
string = """Name: Jane Doe, Email: jd12@uw.comn
Name: Sally Sue Draper, Email: ssd59@gmail.edun
Name: J.D. Salinger, Email: sal.jd@hotmail.org"""
people = [person for person in string.split('n') if person]
people_list = []
for person in people:
name = ''
for char in person[6:]:
if char == ',':
break
else:
name = char
email = ''
for char in person[::-1]:
if char == ' ':
break
else:
email = char
email = email[::-1]
person_tuple = (name, email)
people_list.append(person_tuple)
Это даст вам список кортежей, если вы напечатаете people_list
:
[('Jane Doe', 'jd12@uw.com'), ('Sally Sue Draper', 'ssd59@gmail.edu'), ('J.D. Salinger', 'sal.jd@hotmail.org')]
Предполагается, что все ваши строки начинаются с Name:
, поэтому цикл создает имя путем объединения всех символов после этого вплоть до первой найденной запятой.
Для электронного письма он делает то же самое наоборот: принимает все символы, начиная с конца строки, пока не найдет пробел, на котором электронное письмо фактически заканчивается. Затем он возвращает его обратно, чтобы получить правильное электронное письмо.
Чтобы создать список контактов, цикл отформатирует name
и email
в кортеж, к которому будет добавляться people_list
до тех пор, пока больше не останется контактов для добавления.
Если вы настаиваете на использовании регулярных выражений, то их можно использовать для проверки адресов электронной почты и не добавлять контакт в свой список, если электронное письмо не соответствует выбранному вами формату (или вместо этого оставьте его пустым). Шаблон регулярных выражений может выглядеть следующим образом:
email = 'example@email.com'
pattern = r'[a-z] [a-z0-9]*[w._-]*@[a-z] .[a-z]{1,3}$'
if re.match(pattern, email):
# do something with email here
Обратите внимание, что в этом случае регулярное выражение использует символы типа
и *
, чтобы избежать повторения, что является одним из ключей к созданию более надежного регулярного выражения.