负向前瞻断言不在python中工作

Eri*_*rik 7 python regex lookahead assertion

任务:
- 给定:图像文件名列表
- 待办事项:创建一个文件名不包含单词"thumb"的新列表 - 即仅定位非缩略图图像(使用PIL - Python Imaging Library).

我试过r".*(?!thumb).*"但是失败了.

我已经找到了解决方案(在这里的stackoverflow)来预先添加^到正则表达式并将其置于.*负向前瞻:r"^(?!.*thumb).*"这现在有效.

问题是,我想了解为什么我的第一个解决方案不起作用,但我不这样做.由于正则表达式足够复杂,我真的很想理解它们.

我所理解的是^告诉解析器以下条件是在字符串的开头匹配.但不是.*(不工作)第一个例子也不是从字符串的开头开始的吗?我认为它会从字符串的开头开始,并在到达"拇指"之前搜索尽可能多的字符.如果是这样,它将返回不匹配.

有人可以解释为什么r".*(?!thumb).*"不起作用但是r"^(?!.*thumb).*"吗?

谢谢!

Jon*_*nts 5

有人可以解释为什么r".*(?!thumb).*"不起作用但是 r"^(?!.*thumb).*"吗?

第一个将始终匹配,因为.*将消耗所有字符串(所以它不能被任何东西跟随负向前瞻失败).第二个是有点复杂的,并且将从行的开头匹配,最多的字符直到它遇到"拇指"并且如果存在,那么整个匹配失败,因为该行开始后面跟着'拇指' .

第二个更容易写为:

  • 'thumb' not in string
  • not re.search('thumb', string) (而不是匹配)

正如我在评论中提到的,你的问题是:

文件名不包含单词 "拇指"

因此,您可能希望考虑是否thumbs up应该被排除在外.