Зачем (? - PullRequest
       17

Зачем (?

0 голосов
/ 20 декабря 2018
m = re.match('(?<!index)\.html?', 'abc.html')
print(m)

не может сравниться, на моей памяти это должно работать ... Я новичок, пожалуйста, помогите мне.Большое спасибо.

1 Ответ

0 голосов
/ 20 декабря 2018

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':

Конечно, он немного длиннее, но гораздо менее сложен / подвержен ошибкам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...