Доступ к значению в defaultdict и удаление его части url

#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. Спасибо, Мартин, действительно ценю это. Это сработало, и, играя с итерациями в словаре, я узнал кое-что новое. 🙂