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

时间: 2024-10-07 11:20:28

Python: 用shell通配符匹配字符串,fnmatch/fnmatchcase的相关文章

40 python 正则表达式 match方法匹配字符串 使用search函数在一个字符串中查找子字

第一课: 使用match方法匹配字符串 # 正则表达式:使用match方法匹配字符串 ''' 正则表达式:是用来处理文本的,将一组类似的字符串进行抽象,形成的文本模式字符串 windows dir *.txt file1.txt file2.txt abc.txt test.doc a-file1.txt-b linux/mac ls 主要是学会正则表达式的5方面的方法 1. match:检测字符串是否匹配正则表达式 2. search:在一个长的字符串中搜索匹配正则表达式的子字符串 3. fi

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

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

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

【转载】Python使用中文正则表达式匹配指定中文字符串的方法示例

本文实例讲述了Python使用中文正则表达式匹配指定中文字符串的方法.分享给大家供大家参考,具体如下: 业务场景: 从中文字句中匹配出指定的中文子字符串 .这样的情况我在工作中遇到非常多, 特梳理总结如下. 难点: 处理GBK和utf8之类的字符编码, 同时正则匹配Pattern中包含汉字,要汉字正常发挥作用,必须非常谨慎.推荐最好统一为utf8编码,如果不是这种最优情况,也有酌情处理. 往往一个具有普适性的正则表达式会简化程序和代码的处理,使过程简洁和事半功倍,这往往是高手和菜鸟最显著的差别.

42 python中正则中的分组 正则中匹配字符串的起始和结尾以及单词边界

第七课 正则中的分组 # 分组 # 正则表达式中用一对圆括号括起来的部分被称为一个分组 # '(\d\d\d)-(\d\d)' import re ''' 1. 只有圆括号括起来的部分才算一组,如果正则表达式中既有被圆括号括起来的部分, 也有未被圆括号括起来的部分,那么只将圆括号括起来的部分算一组 2. group方法,如果不指定参数,会返回匹配的整个字符串,如果加参数,会返回指定 分组的字符串,组索引从1开始 3. groups方法,以元组形式返回匹配的所有分组 4. 分组的索引是从1开始的

python数据结构之数字和字符串

python数据类型: Number(数字) String(字符串) List(列表) Dictonary(字典) Tuple(元组) sets(集合) 其中数字.字符串.元组是不可变的,列表.字典是可变的. 对不可变类型的变量重新赋值,实际上是重新创建一个不可变类型的对象,并将原来的变量重新指向新创建的对象(如果没有其他变量引用原有对象的话(即引用计数为0),原有对象就会被回收). 数字 int:整数    1.正负数   2.十六进制(表示方式为0x或者0X开头.例如:0xff)   3.八

Linux Shell 通配符、转义字符、元字符、特殊字符

一.linux shell通配符(wildcard) 通配符是由shell处理的(不是由所涉及到命令语句处理的,其实我们在shell各个命令中也没有发现有这些通配符介绍), 它只会出现在命令的"参数"里(它不用在命令名称里,也不用在操作符上).当shell在"参数"中遇到了通配符时,shell会将其当作路径或文件名去在磁盘上搜寻可能的匹配:若符合要求的匹配存在,则进行替换(路径扩展):否则就将该通配符作为一个普通字符传递给"命令",然后再由命令进

linux shell通配符、元字符、转义符

Linux Shell 通配符.元字符.转义符使用实例介绍 说到shell通配符(wildcard),大家在使用时候会经常用到.下面是一个实例: 1 1 2 3 4 [[email protected] ~/shell]$ ls a.txt  b.txt  c.old #2 1 2 3 4 [[email protected] ~/shell]$ ls *.txt a.txt  b.txt #3 1 2 [[email protected] ~/shell]$ ls d*.txt ls: 无法访

Linux Shell编程之五字符串的处理

shell编程之字符串处理 在 shell 中,由于是一种弱类型的语言,在没有事先申明变量类型的情况下,所有的变量都是字符串.所以对字符串的处理就显得相当重要了. 下面介绍常见的对字符串处理的操作. 一.字符串切片 ${string_var:offest:length},类似于数组元素的提取. # 这里的string_var是一个变量,offest 是字符串的开始偏移量,length是切去字符串的长度 var=dhcpd:x:177:177:DHCP server:/:/sbin/nologin