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篇:正則:文本模式的匹配和查找
相關文章
相關標籤/搜索