Python进阶编程:编写更高效、优雅的Python代码
上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()函数通常是一个比较合理的方案。