2014-09-23 1 views
0

문자열에서 도메인 이름을 선택하고 사전에 입력하고 싶습니다. 그래서 나는이 문자열에 re.match()re.groupdict()를 사용어떻게 사전을 얻을 수있는 re.match() 및 re.groupdict() 복잡한 정규식?

Location: hk USER: Will Lee PASS: 1234 INFO: www.hotmail.com 

코드는이 "도메인"이고 값이 "핫메일"키 사전을해야

re.match(r"(?P<Domain>\.([a-zA-Z0-9]+?)\.(?=com))",str).groupdict() 

이지만, 어떻게 든 반환 :

AttributeError: 'NoneType' object has no attribute 'groupdict' 

어떻게 해결할 수 있습니까?

+3

그 패턴은 전체 문자열과 '일치'하지 않으므로're.search (...). groupdict()'를 시도하십시오. – jonrsharpe

+0

또한 패턴을 수정해야합니다. –

+0

'str'과 같은 변수 이름은 사용하지 마십시오. 실제 파이썬 str 형식을 모호하게합니다. 그리고 나중에 더 오랫동안 코드를 유지하려고하는 사람들을 혼란스럽게합니다. – PaulMcG

답변

1

일치 항목은 re.match 대신 re.search을 사용해야합니다. 일치 항목은 처음부터 텍스트를 찾으려고하기 때문입니다. 또한 당신은> ... 당신은? P < ..dict 키 (와 re.match 사용해야 .com

>>> re.search(r'(?P<Domain>[a-zA-Z0-9]+)(?=\.com)', s).groupdict() 
{'Domain': 'hotmail'} 
0

문자열 다음에 하나 개 이상의 영숫자 문자를 캡처 표명 내다 내부의 점을 줄 필요가) 및 groupdict(). 코드 :

import re 
s="Location: hk USER: Will Lee PASS: 1234 INFO: www.hotmail.com" 
yourDict = re.match(r"^Location: (?P<Location>\w+?) USER: (?P<User>.+?(?= PASS: .+? INFO: .+$)) PASS: (?P<Pass>.+?(?= INFO: .+$)) INFO: (?P<Doman>.+$)",s).groupdict() 

=> { '사용자': '윌 리', 'Doman': 'www.hotmail.com', '위치': '홍콩', '패스': '1234'}