首页 > 编程语言 > 详细

【python cookbook】【字符串与文本】3.利用shell通配符做字符串匹配

时间:2016-08-13 11:18:17      阅读:293      评论:0      收藏:0      [点我收藏+]

问题:当工作在Linux shell下时,使用常见的通配符模式(即,*.py、Dat[0-9]*.csv等)来对文本做匹配

解决方案:fnmatch模块提供的两个函数fnmatch()、fnmatchcase()

#fnmatch()的匹配模式所采用的大小写区分规则和底层文件系统相同(根据操作系统的不同 而不同)

#fnmatchcase()的匹配模式区分大小写

>>> from fnmatch import fnmatch,fnmatchcase
>>> fnmatch(foo.txt,.txt)
False
>>> fnmatch(foo.txt,*.txt)
True
>>> fnmatch(foo.txt,?oo.txt)
True
>>> fnmatch(Dat34.csv,Dat[0-9]*)
True
>>> names=[Dat34.csv,Dat1.csv,config.ini,foo.py]
>>> [name for name in names if fnmatch(name,Dat*.csv)]
[Dat34.csv, Dat1.csv]
>>> 
>>> fnmatch(foo.txt,*.TXT)#ON WINDOWS 大写字母匹配
True
>>> fnmatchcase(‘foo.txt‘,‘*.TXT‘)#on windows大写字母匹配
False
>>> >>> fnmatch(foo.txt,*.TXT)#ON OS X(Mac) 大写字母匹配 False >>>

这些函数一个潜在的用途,是它们处理非文件名式的字符串时的特性

# example.py
#
# Example of using shell-wildcard style matching in list comprehensions

from fnmatch import fnmatchcase as match

addresses = [
    5412 N CLARK ST,
    1060 W ADDISON ST,
    1039 W GRANVILLE AVE,
    2122 N CLARK ST,
    4802 N BROADWAY,
]

a = [addr for addr in addresses if match(addr, * ST)]
print(a)

b = [addr for addr in addresses if match(addr, 54[0-9][0-9] *CLARK*)]
print(b)
>>> ================================ RESTART ================================
>>> 
[5412 N CLARK ST, 1060 W ADDISON ST, 2122 N CLARK ST]
[5412 N CLARK ST]
>>> 

实际上是想编写匹配文件名的代码,应该使用glob模块来完成。

 

【python cookbook】【字符串与文本】3.利用shell通配符做字符串匹配

原文:http://www.cnblogs.com/apple2016/p/5767543.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!