본문 바로가기
개발/Python

[파이썬] 정규식에서 반복되는 하위 패턴

by MinorMan 2023. 8. 12.
반응형

<질문>

이메일 주소를 일치시키는 동안 다음과 같이 일치시킨 후yasar@webmail, 다음 중 하나 이상을 캡처하고 싶습니다.(\.\w+)(내가하고있는 일은 조금 더 복잡합니다. 이것은 단지 예일뿐입니다) (.\w+)+ 를 추가하려고 시도했지만 마지막 일치 만 캡처합니다. 예를 들어,yasar@webmail.something.edu.tr일치하지만 포함만.tr~ 후에yasar@webmail그래서 내가 졌다..something그리고.edu여러 떼. Python 정규 표현식에서 이 작업을 수행할 수 있습니까, 아니면 처음에는 모든 항목을 일치시키고 나중에 하위 패턴을 분할할 것을 제안하시겠습니까?


<답변1>

re모듈은 반복 캡처를 지원하지 않습니다(regex지원합니다):

>>> m = regex.match(r'([.\w]+)@((\w+)(\.\w+)+)', 'yasar@webmail.something.edu.tr')
>>> m.groups()
('yasar', 'webmail.something.edu.tr', 'webmail', '.tr')
>>> m.captures(4)
['.something', '.edu', '.tr']

귀하의 경우에는 나중에 반복되는 하위 패턴을 분할할 것입니다. 간단하고 읽기 쉬운 코드로 이어집니다. 예를 들어 다음의 코드를 참조하세요.@Li-aung Yip's answer.


<답변2>

의 문제를 해결할 수 있습니다.(\.\w+)+대신 다음을 수행하여 마지막 경기만 캡처합니다.((?:\.\w+)+)


<답변3>

다음과 같이 작동합니다.

>>> regexp = r"[\w\.]+@(\w+)(\.\w+)?(\.\w+)?(\.\w+)?(\.\w+)?(\.\w+)?"
>>> email_address = "william.adama@galactica.caprica.fleet.mil"
>>> m = re.match(regexp, email_address)
>>> m.groups()
('galactica', '.caprica', '.fleet', '.mil', None, None)

그러나 최대 6개의 하위 그룹으로 제한됩니다. 이를 수행하는 더 좋은 방법은 다음과 같습니다.

>>> m = re.match(r"[\w\.]+@(.+)", email_address)
>>> m.groups()
('galactica.caprica.fleet.mil',)
>>> m.group(1).split('.')
['galactica', 'caprica', 'fleet', 'mil']

정규식은 이메일 주소가 단순하다면 괜찮지만 이것이 깨지는 모든 종류의 것들이 있습니다. 보다this question이메일 주소 정규식의 자세한 처리를 위해.


<답변4>

이것이 당신이 찾고 있는 것입니다:

>>> import re

>>> s="yasar@webmail.something.edu.tr"
>>> r=re.compile("\.\w+")
>>> m=r.findall(s)

>>> m
['.something', '.edu', '.tr']
728x90

댓글