当前位置:网站首页>《Python Cookbook 3rd》笔记(2.3):用Shell通配符匹配字符串
《Python Cookbook 3rd》笔记(2.3):用Shell通配符匹配字符串
2020-11-10 10:51:00 【巨輪】
用 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() 函数匹配能力介于简单的字符串方法和强大的正则表达式之间。如果在数据处理操作中只需要简单的通配符就能完成的时候,这通常是一个比较合理的方案。
版权声明
本文为[巨輪]所创,转载请带上原文链接,感谢
https://my.oschina.net/jallenkwong/blog/4710735
边栏推荐
- 关于centos启动报错:Failed to start Crash recovery kernel arming的解决方案
- Collection of blockchain theory [31]
- layer.prompt(options, yes) - 输入层
- Mongodb index management of distributed document storage database
- MultiBank Group宣布创纪录的财务业绩,2020年前三季度毛利达到9,400万美元
- 腾讯云TBase在分布式HTAP领域的探索与实践
- B. protocal has 7000eth assets in one week!
- 用例子理解递归
- 注册滴滴加不上车怎么办?要怎么处理?
- [technical course] peerconnection in webrtc self built by visual studio 2017_ The client program reported an external symbol error that LNK2019 could not resolve
猜你喜欢
[Python learning manual notes] 001. Preface to Python
【高级测试工程师】新鲜出炉的三套价值18K的自动化测试面试(网易、字节跳动、美团)
leetcode1-两数之和
【操作教程 】国标GB28181协议安防视频平台EasyGBS订阅功能介绍及开启步骤
《Python Cookbook 3rd》笔记(2.4):字符串匹配和搜索
极验无感验证破解
Centos7 rsync+crontab 定时备份
Bartender2021 realizes secure remote label printing, new year-end release
ElasticSearch 集群基本概念及常用操作汇总(建议收藏)
Leetcode 1-sum of two numbers
随机推荐
[elixir! #0073] beam 内置的内存数据库 —— ETS
我手撸了一个划线翻译工具!
商品管统——采购需求合并到采购单
File初相识
LeetCode:二叉树(四)
[论文阅读笔记] A Multilayered Informative Random Walk for Attributed Social Network Embedding
Several solutions to the problem that selenium webdriver always fails to use click
想花钱速学互联网行业,大概花两三个月的时间,出来好找工作吗
Factory approach model
中央重点布局:未来 5 年,科技自立自强为先,这些行业被点名
Thinking about competitive programming: myths and shocking facts
iOS14新特性-WidgetKit开发与实践
[论文阅读笔记] RoSANE, Robust and scalable attributed network embedding for sparse networks
Looking for a small immutable dictionary with better performance
An unsafe class named unsafe
【LeetCode】 93 平衡二叉树
[paper reading notes] large scale heterogeneous feature embedding
csdn bug5:待加
Only options request is sent, no post solution is sent
Collection of blockchain theory [31]