m = re.match('(?<!index)\.html?', 'abc.html')
print(m)
无法匹配,在我的记忆中它应该可以工作... 我是菜鸟,请帮帮我。非常感谢。
答案 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':
当然,它会更长一些,但是它的复杂度/错误率要低得多。