При сопоставлении адреса электронной почты после того, как я сопоставляю что-то вроде [email protected]
, я хочу записать один или несколько из (\.\w+)
(то, что я делаю, немного сложнее, это просто пример), я попробовал добавление (.\w +) +, но только фиксирует последнее совпадение. Например, [email protected]
соответствует, но включает только .tr
после [email protected]
, поэтому я потерял группы .something
и .edu
. Могу ли я сделать это в регулярных выражениях Python, или вы бы предложили сначала сопоставить все, и позже разделите подшаблоны?
Захват повторяющихся подшаблонов в регулярном выражении Python
Ответ 1
re
модуль не поддерживает повторные захваты (regex
поддерживает его):
>>> m = regex.match(r'([.\w]+)@((\w+)(\.\w+)+)', '[email protected]')
>>> m.groups()
('yasar', 'webmail.something.edu.tr', 'webmail', '.tr')
>>> m.captures(4)
['.something', '.edu', '.tr']
В вашем случае я бы пошел с разделением повторных подшаблонов позже. Это приводит к простому и легко читаемому коду, например, см. Код в @Li-aung Yip answer.
Ответ 2
Это будет работать:
>>> regexp = r"[\w\.][email protected](\w+)(\.\w+)?(\.\w+)?(\.\w+)?(\.\w+)?(\.\w+)?"
>>> email_address = "[email protected]"
>>> m = re.match(regexp, email_address)
>>> m.groups()
('galactica', '.caprica', '.fleet', '.mil', None, None)
Но он ограничивается максимум шестью подгруппами. Лучший способ сделать это:
>>> m = re.match(r"[\w\.][email protected](.+)", email_address)
>>> m.groups()
('galactica.caprica.fleet.mil',)
>>> m.group(1).split('.')
['galactica', 'caprica', 'fleet', 'mil']
Обратите внимание, что регулярные выражения являются точными до тех пор, пока адреса электронной почты просты - но есть все виды вещей, для которых это будет нарушено. См. этот вопрос для подробного рассмотрения регулярных выражений адресов электронной почты.
Ответ 3
Вы можете решить проблему (\.\w+)+
только для захвата последнего совпадения, сделав это вместо этого: ((?:\.\w+)+)
Ответ 4
Это то, что вы ищете:
>>> import re
>>> s="[email protected]"
>>> r=re.compile("\.\w+")
>>> m=r.findall(s)
>>> m
['.something', '.edu', '.tr']