re.match
включает неявное начало привязки строки.(?<!index)
говорит, что .
не может предшествовать index
, но оно также не соответствует ничему, кроме index
, поэтому неявная привязка означает, что это эффективно соответствует только начинающимся строкам .html?
.
Чтобы исправить, либо используйте re.search
вместо re.match
(удаляя неявную привязку), либо явно захватите предыдущий текст (с отрицательным утверждением lookbehind, по-прежнему исключающим все, что заканчивается index
):
m = re.match('.*(?<!index)\.html?', 'abc.html') # Use re.fullmatch to prevent arbitrary suffixes
# ^^ added
Чтобы разрешить вещи, которые заканчиваются на index
, но не совсем index
, вы можете использовать чередование:
m = re.match('(?:.{6,}|.{,5}(?<!index))\.html?', 'aindex.html')
, где мы разрешаем совпадение, еслиимя по крайней мере шесть символов или это пять или меньше, и они не index
.
Я отмечу, сложность здесь означает, что я был бы склонен пропуститьполностью регулярное выражение;методы простой строки будут довольно хорошими.Например, предполагая, что это просто тестирование, а не используя полученный объект соответствия, вы можете заменить:
if re.match('(?:.{6,}|.{,5}(?<!index))\.html?', filename):
на:
if filename.endswith(('.htm', '.html')) and filename not in ('index.htm', 'index.html'):
или:
root, ext = os.path.splitext(filename)
if ext in ('.htm', '.html') and root != 'index':
Конечно, он немного длиннее, но гораздо менее сложен / подвержен ошибкам.