#python #regex #dictionary #defaultdict
#python #регулярное выражение #словарь #defaultdict
Вопрос:
У меня очень большой defaultdict, в котором есть dict внутри dict, внутренний dict, содержащий html из тела электронной почты. Я только хочу вернуть строку http из внутреннего dict. Каков наилучший способ извлечь это?
Нужно ли мне преобразовывать dict в другую структуру данных перед использованием регулярных выражений? Есть ли лучший способ? Я все еще новичок в Python и ценю любые указания.
Например, с чем я работаю:
defaultdict(<type 'dict'>, {16: {u'SEQ': 16, u'RFC822': u'Delivered-To:
somebody@email.com LOTS MORE HTML until http://the_url_I_want_to_extract.com' }}
Одна вещь, которую я пробовал, — это использовать re.findall в defaultdict, который не сработал:
confirmation_link = re.findall('Click this link to confirm your registration:<br />"
(.*?)"', body)
for conf in confirmation_link:
print conf
Ошибка:
line 177, in findall
return _compile(pattern, flags).findall(string)
TypeError: expected string or buffer
Комментарии:
1. Что вы пробовали до сих пор? Какой код у вас есть? В чем проблема?
2. Попробовал несколько вещей, например, прямое использование re, которое, насколько я могу судить, не работает с dicts. Как и итерации в теле и поиск key.startswith, но просто не знаю, в каком направлении двигаться. Я обновлю пост некоторыми материалами, которые я пробовал, спасибо.
3. Пожалуйста, обновите свой вопрос кодом, который создает и демонстрирует конкретную проблему.
Ответ №1:
Вы можете использовать регулярное выражение только после того, как вы перебрали свой словарь для соответствующего значения:
import re
d = defaultdict(<type 'dict'>, {16: {u'SEQ': 16, u'RFC822': u'Delivered-To: somebody@email.com LOTS MORE HTML until http://the_url_I_want_to_extract.com' }}
for k, v in d.iteritems():
#v is the dictionary that contains your html string:
str_with_html = v['RFC822']
#this regular expression starts with matching http, and then
#continuing until a white space character is hit.
match = re.search("http[^s] ", str_with_html)
if match:
print match.group(0)
Вывод:
http://the_url_I_want_to_extract.com
Комментарии:
1. Спасибо, Мартин, действительно ценю это. Это сработало, и, играя с итерациями в словаре, я узнал кое-что новое. 🙂