任务:
- 考虑:图片的文件名列表
- TODO:创建不包含单词“拇指”文件名一个新的列表 - 即只针对非缩略图(与PIL - Python图像库)。
我试过r".*(?!thumb).*"
但失败了。
我已经找到了解决方案(这里计算器)前面加上一个^
的正则表达式,并把.*
为负前瞻: r"^(?!.*thumb).*"
和现在这个工作。
问题是,我想知道为什么我的第一个解决方案没有工作,但我不知道。 由于正则表达式是够复杂的了,我真的想了解他们。
我不明白的是, ^
告诉下列条件相匹配的字符串的开头解析器。 但没有了.*
在(没有工作)第一个例子也开始在字符串的开始? 我认为这将开始在字符串的开头,并达到了“拇指”之前通过尽可能多的字符搜索,因为它可以。 如果是的话它会返回一个不匹配。
可能有人请解释为什么r".*(?!thumb).*"
不工作,但r"^(?!.*thumb).*"
呢?
谢谢!
(织补,乔恩打我。哦,你可以看一下实例反正)
像其他人所说的,正则表达式是不是这个职位的最佳工具。 如果您正在使用文件路径的工作,看看os.path中 。
用于过滤文件,你不想要的,你可以做if 'thumb' not in filename: ...
一旦你解剖路径(其中filename
是str
)。
和对子孙后代的,这里是我对那些正则表达式的想法。 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.match
或re.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'
可能有人请解释为什么r".*(?!thumb).*"
不工作,但r"^(?!.*thumb).*"
呢?
第一个将总是匹配的.*
将消耗所有的字符串(所以不能跟着何事负向前查找失败)。 第二个是有点令人费解,并从该行的开始匹配,字符的最大量,直到遇到“大拇指”,如果这是存在,那么整场比赛失败,因为行确实与一些其次是“拇指”开始。
排名第二的是更容易写成:
-
'thumb' not in string
-
not re.search('thumb', string)
(而不是匹配)
也正如我在评论中提到,你的问题说:
文件名不包含单词 “拇指”
所以,你不妨考虑是否不thumbs up
应该被排除或不。
忽略有关正则表达式的所有位,你的任务似乎相当简单:
- 给定:图片的文件名列表
- 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)
正则表达式是不是真的有必要为这个简单的任务。