Подтвердить что ты не робот

Захват повторяющихся подшаблонов в регулярном выражении Python

При сопоставлении адреса электронной почты после того, как я сопоставляю что-то вроде [email protected], я хочу записать один или несколько из (\.\w+) (то, что я делаю, немного сложнее, это просто пример), я попробовал добавление (.\w +) +, но только фиксирует последнее совпадение. Например, [email protected] соответствует, но включает только .tr после [email protected], поэтому я потерял группы .something и .edu. Могу ли я сделать это в регулярных выражениях Python, или вы бы предложили сначала сопоставить все, и позже разделите подшаблоны?

4b9b3361

Ответ 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']