кортежи вопросов в регулярном выражении -регулярные выражения

#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
  

Обратите внимание, что в этом случае регулярное выражение использует символы типа и * , чтобы избежать повторения, что является одним из ключей к созданию более надежного регулярного выражения.