Python Regex "не имеет атрибута"
Я собрал список страниц, которые нам нужно обновить с новым контентом (мы переключаем медиаформаты). В процессе я каталогизирую страницы, которые правильно имеют новый контент.
Вот общая идея того, что я делаю:
- Итерация через файловую структуру и получение списка файлов
- Для каждого файла, читаемого в буфер, и, используя поиск в регулярном выражении, соответствует определенному тегу
- Если сопоставлено, проверьте еще 2 регулярных выражения
- записать полученные совпадения (один или другой) в базу данных
Все работает отлично до тех пор, пока не будет найдено 3-ий шаблон регулярного выражения, где я получаю следующее:
'NoneType' object has no attribute 'group'
# only interested in embeded content
pattern = "(<embed .*?</embed>)"
# matches content pointing to our old root
pattern2 = 'data="(http://.*?/media/.*?")'
# matches content pointing to our new root
pattern3 = 'data="(http://.*?/content/.*?")'
matches = re.findall(pattern, filebuffer)
for match in matches:
if len(match) > 0:
urla = re.search(pattern2, match)
if urla.group(1) is not None:
print filename, urla.group(1)
urlb = re.search(pattern3, match)
if urlb.group(1) is not None:
print filename, urlb.group(1)
спасибо.
Ответы
Ответ 1
Ваше исключение означает, что urla имеет значение None. Поскольку значение urla определяется вызовом re.search, следует, что re.search возвращает None. И это происходит, когда строка не соответствует шаблону.
Итак, в основном вы должны использовать:
urla = re.search(pattern2, match)
if urla is not None:
print filename, urla.group(1)
вместо того, что у вас есть.
Ответ 2
Причиной TypeError
является то, что search
или match
обычно возвращают либо MatchObject
, либо None
. Только один из них имеет метод group
. И это не None
. Итак, вам нужно сделать:
url = re.search(pattern2, match)
if url is not None:
print(filename, url.group(0))
P.S. PEP-8 предлагает использовать 4 пробела для отступов. Это не просто мнение, это хорошая практика. Ваш код довольно трудно прочитать.
Ответ 3
У меня такая же проблема.
Используя python2.6, вы можете решить его следующим образом:
for match in matches:
if len(match) > 0:
urla = re.search(pattern2, match)
try:
urla.group(1):
print filename, urla.group(1)
excpet:
print "Problem with",pattern2
urlb = re.search(pattern3, match)
try:
urlb.group(1)
print filename, urlb.group(1)
except:
print "Problem with",pattern3
Ответ 4
Также обратите внимание на ошибочное предположение, что ошибка была в третьем матче, когда она была фактически во втором. Это, по-видимому, привело к ошибочному предположению, что второй матч сделал что-то, чтобы сделать недействительным третий, отправив вас в путь.