반응형
<질문>
이메일 주소를 일치시키는 동안 다음과 같이 일치시킨 후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']
반응형
'개발 > Python' 카테고리의 다른 글
PyGame 애니메이션이 깜박이는 이유 (1) | 2023.08.12 |
---|---|
[파이썬] 내 파이게임 애플리케이션 루프가 제대로 작동하지 않는 이유 (0) | 2023.08.12 |
[파이썬] 반복 변수를 수정해도 후속 반복에 영향을 주지 않는 이유 (0) | 2023.08.12 |
[파이썬] XML 파일을 pandas 데이터 프레임으로 변환하는 방법 (0) | 2023.08.12 |