式断言在Python不工作(negative lookahead assertion not wor

2019-07-05 06:05发布

任务:
- 考虑:图片的文件名列表
- TODO:创建不包含单词“拇指”文件名一个新的列表 - 即只针对非缩略图(与PIL - Python图像库)。

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

我已经找到了解决方案(这里计算器)前面加上一个^的正则表达式,并把.*为负前瞻: r"^(?!.*thumb).*"和现在这个工作。

问题是,我想知道为什么我的第一个解决方案没有工作,但我不知道。 由于正则表达式是够复杂的了,我真的想了解他们。

我不明白的是, ^告诉下列条件相匹配的字符串的开头解析器。 但没有了.*在(没有工作)第一个例子也开始在字符串的开始? 我认为这将开始在字符串的开头,并达到了“拇指”之前通过尽可能多的字符搜索,因为它可以。 如果是的话它会返回一个不匹配。

可能有人请解释为什么r".*(?!thumb).*"不工作,但r"^(?!.*thumb).*"呢?

谢谢!

Answer 1:

(织补,乔恩打我。哦,你可以看一下实例反正)

像其他人所说的,正则表达式是不是这个职位的最佳工具。 如果您正在使用文件路径的工作,看看os.path中 。

用于过滤文件,你不想要的,你可以做if 'thumb' not in filename: ...一旦你解剖路径(其中filenamestr )。

和对子孙后代的,这里是我对那些正则表达式的想法。 r".*(?!thumb).*"不为工作,因为.*是贪婪和先行给出一个非常低优先级。 看看这个:

>>> re.search('(.*)((?!thumb))(.*)', '/tmp/somewhere/thumb').groups()
('/tmp/somewhere/thumb', '', '')
>>> re.search('(.*?)((?!thumb))(.*)', '/tmp/somewhere/thumb').groups()
('', '', '/tmp/somewhere/thumb')
>>> re.search('(.*?)((?!thumb))(.*?)', '/tmp/somewhere/thumb').groups()
('', '', '')

最后一个是很奇怪...

其他正则表达式( r"^(?!.*thumb).*" )工作,因为.*是先行里面,所以你不要有被盗取字符的任何问题。 事实上,你甚至都不需要^ ,这取决于如果您正在使用re.matchre.search

>>> re.search('((?!.*thumb))(.*)', '/tmp/somewhere/thumb').groups()
('', 'humb')
>>> re.search('^((?!.*thumb))(.*)', '/tmp/somewhere/thumb').groups()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'NoneType' object has no attribute 'groups'
>>> re.match('((?!.*thumb))(.*)', '/tmp/somewhere/thumb').groups()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'NoneType' object has no attribute 'groups'


Answer 2:

可能有人请解释为什么r".*(?!thumb).*"不工作,但r"^(?!.*thumb).*"呢?

第一个将总是匹配的.*将消耗所有的字符串(所以不能跟着何事负向前查找失败)。 第二个是有点令人费解,并从该行的开始匹配,字符的最大量,直到遇到“大拇指”,如果这是存在,那么整场比赛失败,因为行确实与一些其次是“拇指”开始。

排名第二的是更容易写成:

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

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

文件名不包含单词 “拇指”

所以,你不妨考虑是否不thumbs up应该被排除或不。



Answer 3:

忽略有关正则表达式的所有位,你的任务似乎相当简单:

  • 给定:图片的文件名列表
  • TODO:创建不包含单词“拇指”文件名一个新的列表 - 即只针对非缩略图(与PIL - Python图像库)。

假设你有一个看起来像这样的文件名列表:

filenames = [ 'file1.jpg', 'file1-thumb.jpg', 'file2.jpg', 'file2-thumb.jpg' ]

然后你就可以得到包含单词拇指这样的文件列表:

not_thumb_filenames = [ filename for filename in filenames if not 'thumb' in filename ]

这就是我们所说的列表理解 ,并且基本上简写:

not_thumb_filenames = []
for filename in filenames:
  if not 'thumb' in filename:
    not_thumb_filenames.append(filename)

正则表达式是不是真的有必要为这个简单的任务。



文章来源: negative lookahead assertion not working in python