为什么(?<!-index)\。html?不能匹配“ abc.html”

时间:2018-12-20 01:27:30

标签: python regex

m = re.match('(?<!index)\.html?', 'abc.html') print(m)

无法匹配,在我的记忆中它应该可以工作... 我是菜鸟,请帮帮我。非常感谢。

1 个答案:

答案 0 :(得分:2)

re.match包含字符串锚的隐式开头。 (?<!index).不能在index的前面,但是它也不匹配任何非index的东西,因此隐式锚意味着有效地仅匹配​​以.html?开头的字符串。

要解决此问题,请使用re.search而不是re.match(除去隐式锚),或显式捕获前面的文本(带有负向后断言的断言仍排除以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':

当然,它会更长一些,但是它的复杂度/错误率要低得多。