python字符串通配符_Python: 用shell通配符匹配字符串,fnmatch/fnmatchcase

问题:想使用Unix Shell 中常用的通配符(比如*.py , Dat[0-9]*.csv 等) 去匹配文本字符串

解决方案:

1.

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']>>>

2.fnmatch() 函数使用底层操作系统的大小写敏感规则(不同的系统是不一样的) 来匹配模式。比如:>>> # On OS X (Mac)>>> fnmatch('foo.txt', '*.TXT')False>>> # On Windows>>> fnmatch('foo.txt', '*.TXT')True>>>如果你对这个区别很在意,可以使用fnmatchcase() 来代替。它完全使用你的模式大小写匹配。比如:>>> fnmatchcase('foo.txt', '*.TXT')False

3.这两个函数通常会被忽略的一个特性是在处理非文件名的字符串时候它们也是很有用的。比如,假设你有一个街道地址的列表数据: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 模块。

转载于:https://www.cnblogs.com/baxianhua/p/8434612.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值