上QQ阅读APP看书,第一时间看更新
2.3.2 用Shell通配符匹配字符串
我们可以使用Unix Shell中常用的通配符(如*.py,*.xml等)进行字符串的匹配。
fnmatch模块提供了两个函数——fnmatch()和fnmatchcase(),以便实现字符串的匹配,示例如下:
from fnmatch import fnmatch, fnmatchcase print(fnmatch('python.txt', '*.txt')) print(fnmatch('hello.txt', '?ello.txt')) print(fnmatch('course_15.csv', 'course_[0-9]*')) names = ['Date_1.csv', 'Date_2.csv', 'config.ini', 'test.py'] print([name for name in names if fnmatch(name, 'Dat*.csv')])
fnmatch()函数使用底层操作系统的大小写敏感规则(不同的系统是不一样的)来匹配模式。一般,Windows操作系统对于大小写是不敏感的,Linux或Mac系统对于大小写是敏感的,大家可以分别进行验证。
如果确实需要区分大小写,可以使用fnmatchcase()函数来代替fnmatch()函数。它完全是大小写匹配的,示例如下:
print(fnmatchcase('python.txt', '*.TXT'))
fnmatch()和fnmatchcase()函数在处理非法字符串时也是很有用的。对于如下列表数据(shell_match_exp.py):
doing_thing = [ 'reading a book', 'watching tv', 'running in the park', 'eating food', 'writing book', ]
可以写成如下的列表推导(shell_match_exp.py):
from fnmatch import fnmatchcase print([doing for doing in doing_thing if fnmatchcase(doing, '* book')]) print([doing for doing in doing_thing if fnmatchcase(doing, '[a-z][a-z]*ing *oo*')])
fnmatch()函数匹配能力介于简单的字符串方法和强大的正则表达式之间。如果在数据处理操作中只需要简单的通配符就能完成,使用fnmatch()函数通常是一个比较合理的方案。