Python实用技法第22篇:利用Shell通配符做字符串匹配

1、需求

当工作在UNIX Shell下时,我们想使用常见的通配符模式(即:.py,Dat[0-9].csv等)来对文本做匹配。

2、解决方案

fnmatch模块提供了两个函数:fnmatch()和fnmatchcase(),可用来执行这样的匹配,使用起来非常简单。

实例:

from fnmatch import fnmatch,fnmatchcase
print(fnmatch(‘mark.txt‘,‘*.txt‘))
print(fnmatch(‘mark.txt‘,‘?ark.txt‘))
print(fnmatch(‘mark2018.txt‘,‘?ark201[0-9].txt‘))
Python资源分享qun 784758214 ,内有安装包,PDF,学习视频,这里是Python学习者的聚集地,零基础,进阶,都欢迎

运行结果:

True
True
True

一般来说,fnmatch()的大小写匹配规则与底层文件相同,例如:

print(fnmatch(‘mark.txt‘,‘*.TXT‘))

上面代码,在Max下运行为False,在Windows下运行为True。

如果这个大小写区别对我们很重要,我们就应该使用fnmatchcase()。它会完全根据我们提供的大小写方法来做匹配。

实例:

from fnmatch import fnmatch,fnmatchcase
print(fnmatchcase(‘mark.txt‘,‘*.TXT‘))

结果:

False

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

例如,

from fnmatch import fnmatchcase

#假设有一组街道地址,就像这样:
address=[
    ‘111 A 上海 SH‘,
    ‘112 B 上海 SH‘,
    ‘113 C 上海 SH‘,
    ‘124 D 北京 BJ‘,
    ‘138 E 北京 BJ‘,
    ‘145 F 北京 BJ‘,
]

result=[addr for addr in address if fnmatchcase(addr,‘1[1-3][1-5]*BJ‘)]
print(result)

运行结果:

[‘124?D 北京 BJ‘]
Python资源分享qun 784758214 ,内有安装包,PDF,学习视频,这里是Python学习者的聚集地,零基础,进阶,都欢迎

3、分析

fnmatch完成的匹配操作有点介于简单的字符串方法和全功能的正则表达式之间。

如果实际上是想编写匹配文件名的代码,那应该使用glob模块来完成,后面会介绍到的。

原文地址:https://blog.51cto.com/14445003/2429269

时间: 2024-12-09 19:25:25

Python实用技法第22篇:利用Shell通配符做字符串匹配的相关文章

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

问题:当工作在Linux shell下时,使用常见的通配符模式(即,*.py.Dat[0-9]*.csv等)来对文本做匹配 解决方案:fnmatch模块提供的两个函数fnmatch().fnmatchcase() #fnmatch()的匹配模式所采用的大小写区分规则和底层文件系统相同(根据操作系统的不同 而不同) #fnmatchcase()的匹配模式区分大小写 >>> from fnmatch import fnmatch,fnmatchcase >>> fnmatc

Python实用技法第32篇:对齐文本字符串

问题 我们需要以某种对齐方式将文本做格式化处理. 解决方案 对于基本的字符串对齐要求,可以使用字符串的ljust().rjust()和center()方法.示例如下: >>> text = 'Hello World' >>> text.ljust(20) 'Hello World ' >>> text.rjust(20) ' Hello World' >>> text.center(20) ' Hello World ' >&g

Python实用技法第31篇:文本过滤和清理

问题 某些无聊的脚本小子在Web页面表单中填入了"pyt???"这样的文本,我们想以某种方式将其清理掉. 解决方案 文本过滤和清理所涵盖的范围非常广泛,涉及文本解析和数据处理方面的问题.在非常简单的层次上,我们可能会用基本的字符串函数(例如str.upper()和str.lower())将文本转换为标准形式.简单的替换操作可通过str.replace()或re.sub()来完成,它们把重点放在移除或修改特定的字符序列上.也可以利用unicodedata.normalize()来规范化文

Python实用技法第6篇:让字典保持有序

1.需求 我们想创建一个字典,同时当对字典做迭代或序列化操作时,也能控制其中元素的顺序. 2.解决方案 要控制字典中元素的顺序,可以使用collections模块中的OrderedDict类.当对字典做迭代时,它会严格按照元素初始添加的顺序进行. from collections import OrderedDict d=OrderedDict() d['a']=1 d['b']=2 d['c']=3 d['d']=4 #根据插入删除输出 for key in d: print(key,d[ke

Python实用技法第24篇:正则:查找和替换文本

1.需求 我们想对字符串中的文本做查找和替换. 2.解决方案 对于简单的文本模式,使用str.replace()即可. 例如: text='mark ,帅哥,18,183 帅,mark' print(text.replace('18','19')) print(text) Python资源分享qun 784758214 ,内有安装包,PDF,学习视频,这里是Python学习者的聚集地,零基础,进阶,都欢迎 运行结果: mark ,帅哥,19,193 帅,mark mark ,帅哥,18,183

Python实用技法第26篇:定义实现最短匹配的正则表达式

1.需求 我们正在尝试用正则表达式对文本模式做匹配,但识别出来的是最长的可能匹配.相反,我们想将其修改为最短的可能匹配. 2.解决方案 这个问题通常会在匹配的文本被一对开始和结束的分隔符包起来的时候出现(例如带引号的字符串),为了说明这个问题,请看下面实例: import re str_pat=re.compile(r'\"(.*)\"') text1='mark say "love"' text2='mark say "love",jingji

Python实用笔记 (22)面向对象编程——实例属性和类属性

由于Python是动态语言,根据类创建的实例可以任意绑定属性. 给实例绑定属性的方法是通过实例变量,或者通过self变量: class Student(object): def __init__(self, name): self.name = name s = Student('Bob') s.score = 90 但是,如果Student类本身需要绑定一个属性呢?可以直接在class中定义属性,这种属性是类属性,归Student类所有: class Student(object): name

利用shell脚本做一个用户登录系统

效果图如下: #!/bin/bash# while truedocat << EOF//======================\\\\| 用户登录系统 |--------------------------| 1.创建用户 || 2.删除用户 || 3.锁定用户 || 4.解锁用户 || 5.查看用户 || 6.退出脚本 |--------------------------EOF read -p "请输入你的操作选择:" num#输入为1时的判断if [ "

Python之路【第九篇】:Python操作 RabbitMQ、Redis、Memcache、SQLAlchemy

Python之路[第九篇]:Python操作 RabbitMQ.Redis.Memcache.SQLAlchemy Memcached Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载.它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态.数据库驱动网站的速度.Memcached基于一个存储键/值对的hashmap.其守护进程(daemon )是用C写的,但是客户端可以用任何语言来编写,并通过memcached协议与守护进程通信. Memc