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

Также обратите внимание на ошибочное предположение, что ошибка была в третьем матче, когда она была фактически во втором. Это, по-видимому, привело к ошибочному предположению, что второй матч сделал что-то, чтобы сделать недействительным третий, отправив вас в путь.