Python实用技法第22篇:利用Shell通配符作字符串匹配

上一篇文章: Python实用技法第21篇:在字符串的开头和结尾处作文本匹配
上一篇文章: Python实用技法第23篇:正则:文本模式的匹配和查找

一、需求🙀

当工做在UNIX Shell下时,咱们想使用常见的通配符模式(即:*.py,Dat[0-9]*.csv等)来对文本作匹配。

二、解决方案😸

fnmatch模块提供了两个函数:fnmatch()和fnmatchcase(),可用来执行这样的匹配,使用起来很是简单。正则表达式

实例:segmentfault

from fnmatch import fnmatch,fnmatchcase
print(fnmatch('mark.txt','*.txt'))
print(fnmatch('mark.txt','?ark.txt'))
print(fnmatch('mark2018.txt','?ark201[0-9].txt'))

运行结果:函数

True
True
True

通常来讲,fnmatch()的大小写匹配规则与底层文件相同,例如:code

print(fnmatch('mark.txt','*.TXT'))

上面代码,在Max下运行为False,在Windows下运行为True。字符串

若是这个大小写区别对咱们很重要,咱们就应该使用fnmatchcase()。它会彻底根据咱们提供的大小写方法来作匹配。get

实例:import

from fnmatch import fnmatch,fnmatchcase
print(fnmatchcase('mark.txt','*.TXT'))

结果:csv

False

关于这些函数,一个常被忽略的特性是它们在处理非文件名式的字符串时的潜在用途。方法

例如,im

from fnmatch import fnmatchcase

#假设有一组街道地址,就像这样:
address=[
    '111 A 上海 SH',
    '112 B 上海 SH',
    '113 C 上海 SH',
    '124 D 北京 BJ',
    '138 E 北京 BJ',
    '145 F 北京 BJ',
]

result=[addr for addr in address if fnmatchcase(addr,'1[1-3][1-5]*BJ')]
print(result)

运行结果:

['124 D 北京 BJ']

三、分析😈

fnmatch完成的匹配操做有点介于简单的字符串方法和全功能的正则表达式之间。

若是其实是想编写匹配文件名的代码,那应该使用glob模块来完成,后面会介绍到的。

上一篇文章: Python实用技法第21篇:在字符串的开头和结尾处作文本匹配
上一篇文章: Python实用技法第23篇:正则:文本模式的匹配和查找
相关文章
相关标签/搜索