Как я могу использовать словарь 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()
</domain>

Это должно сделать словарь, ключ которого является "Домен", а значение "hotmail", но каким-то образом оно возвращалось:

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

Как я могу это исправить?

2 ответа

Используйте re.search вместо re.match потому что match пытается найти текст с самого начала. А также вам нужно указать точку внутри lookahead, которая утверждает захват одного или нескольких буквенно-цифровых символов, за которым следует строка .com

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


вы должны использовать re.match с (? P <.. dict key...>) и 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></pass></user></location>

=> {'Пользователь': 'Will Lee', 'Doman': 'www.hotmail.com', 'Location': 'hk', 'Pass': '1234'}

licensed under cc by-sa 3.0 with attribution.