2.3 用Shell通é…�符匹é…�å—符串¶
问题¶
ä½ æƒ³ä½¿ç”¨ Unix Shell ä¸å¸¸ç”¨çš„通é…�符(比如 *.py , Dat[0-9]*.csv ç‰)去匹é…�文本å—符串
解决方案¶
fnmatch 模å�—æ��供了两个函数—— fnmatch() å’Œ fnmatchcase() ,å�¯ä»¥ç”¨æ�¥å®žçŽ°è¿™æ ·çš„åŒ¹é…�。用法如下:
>>> from fnmatch import fnmatch, fnmatchcase
>>> fnmatch('foo.txt', '*.txt')
True
>>> fnmatch('foo.txt', '?oo.txt')
True
>>> fnmatch('Dat45.csv', 'Dat[0-9]*')
True
>>> names = ['Dat1.csv', 'Dat2.csv', 'config.ini', 'foo.py']
>>> [name for name in names if fnmatch(name, 'Dat*.csv')]
['Dat1.csv', 'Dat2.csv']
>>>
fnmatch() 函数使用底层æ“�作系统的大å°�写æ•�感规则(ä¸�å�Œçš„系统是ä¸�ä¸€æ ·çš„)æ�¥åŒ¹é…�模å¼�。比如:
>>> # On OS X (Mac)
>>> fnmatch('foo.txt', '*.TXT')
False
>>> # On Windows
>>> fnmatch('foo.txt', '*.TXT')
True
>>>
å¦‚æžœä½ å¯¹è¿™ä¸ªåŒºåˆ«å¾ˆåœ¨æ„�,å�¯ä»¥ä½¿ç”¨ fnmatchcase() æ�¥ä»£æ›¿ã€‚å®ƒå®Œå…¨ä½¿ç”¨ä½ çš„æ¨¡å¼�大å°�写匹é…�。比如:
>>> fnmatchcase('foo.txt', '*.TXT')
False
>>>
这两个函数通常会被忽略的一个特性是在处ç�†é�žæ–‡ä»¶å��çš„å—符串时候它们也是很有用的。 比如,å�‡è®¾ä½ 有一个街é�“地å�€çš„列表数æ�®ï¼š
addresses = [
'5412 N CLARK ST',
'1060 W ADDISON ST',
'1039 W GRANVILLE AVE',
'2122 N CLARK ST',
'4802 N BROADWAY',
]
ä½ å�¯ä»¥åƒ�è¿™æ ·å†™åˆ—è¡¨æŽ¨å¯¼ï¼š
>>> from fnmatch import fnmatchcase
>>> [addr for addr in addresses if fnmatchcase(addr, '* ST')]
['5412 N CLARK ST', '1060 W ADDISON ST', '2122 N CLARK ST']
>>> [addr for addr in addresses if fnmatchcase(addr, '54[0-9][0-9] *CLARK*')]
['5412 N CLARK ST']
>>>
讨论¶
fnmatch() 函数匹é…�能力介于简å�•çš„å—符串方法和强大的æ£åˆ™è¡¨è¾¾å¼�之间。
如果在数æ�®å¤„ç�†æ“�作ä¸å�ªéœ€è¦�简å�•的通é…�符就能完æˆ�的时候,这通常是一个比较å�ˆç�†çš„æ–¹æ¡ˆã€‚
å¦‚æžœä½ çš„ä»£ç �需è¦�å�𿖇件å��的匹é…�,最好使用 glob 模å�—。å�‚考5.13å°�节。