2.3用Shell通配符匹配字符串
2022/2/19 7:13:29
本文主要是介绍2.3用Shell通配符匹配字符串,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
问题
你想使用Unix Shell中常用的通配符(比如*.py,Date[0-9]*.csv
等)去匹配文本支付串
解决方案
fnamtch模块提供了两个模块函数--fnamtch()和fnmatchcase(),可以用来实现这样的匹配。
from fnmatch import fnmatch,fnmatchcase print(fnmatch('foo.txt','*.txt')) # ->True print(fnmatch('foo.txt','?oo.txt'))# ->True print(fnmatch('Dat45.scv','Dat[0-9]*')) # ->True names=['Dat1.csv','Dat2.csv','config.ini','foo.py'] print([name for name in names if fnmatch(name,'Dat*.csv')]) # ->['Dat1.csv', 'Dat2.csv']
fnamtch()函数使用的底层操作系统的大小写敏感规则(不同的系统是不一样的)来匹配模式,比如:
#on OS X (MAX) print(fnmatch('foo.txt','*.TXT')) # ->False #on windows print(fnmatch('foo.txt','*.TXT')) # ->True
如果你对这个区别 很在意,可以使用fnmatchcase()来替代。它完全使用你的模式大小写匹配。比如:
print(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', ] print([addr for addr in addresses if fnmatchcase(addr,"*ST")]) # ->['5412 N CLARK ST', '1060 W ADDISON ST', '2122 N CLARK ST'] print([addr for addr in addresses if fnmatchcase(addr,"54[0-9][0-9]*CLARK*")])
讨论
fnamtch()函数匹配能力介于简单的字符串方法和强大的正则匹配表达式之间。如果在数据处理操作中只需要简单的匹配通配符就能完成的时候,这个通常是一个比较合理的方案。
如果你的代码需要做文件名的匹配,最好使用glob模块。
这篇关于2.3用Shell通配符匹配字符串的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2025-01-11cursor试用出现:Too many free trial accounts used on this machine 的解决方法
- 2025-01-11百万架构师第十四课:源码分析:Spring 源码分析:深入分析IOC那些鲜为人知的细节|JavaGuide
- 2025-01-11不得不了解的高效AI办公工具API
- 2025-01-102025 蛇年,J 人直播带货内容审核团队必备的办公软件有哪 6 款?
- 2025-01-10高效运营背后的支柱:文档管理优化指南
- 2025-01-10年末压力山大?试试优化你的文档管理
- 2025-01-10跨部门协作中的进度追踪重要性解析
- 2025-01-10总结 JavaScript 中的变体函数调用方式
- 2025-01-10HR团队如何通过数据驱动提升管理效率?6个策略
- 2025-01-10WBS实战指南:如何一步步构建高效项目管理框架?