ICode9

精准搜索请尝试: 精确搜索
首页 > 系统相关> 文章详细

2.3用Shell通配符匹配字符串

2022-02-18 11:03:19  阅读:182  来源: 互联网

标签:fnmatch Shell addr 通配符 ST print 2.3 txt csv


问题

​ 你想使用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模块。

标签:fnmatch,Shell,addr,通配符,ST,print,2.3,txt,csv
来源: https://www.cnblogs.com/ye-peng/p/15907666.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有