Python 利用 fnmatch 模块进行 Shell 风格字符串匹配
在 Python 开发中,有时需要利用类似文件系统的通配符规则来匹配字符串。本文介绍如何使用内置的 fnmatch 模块实现这一功能,并解析大小写敏感性的处理差异。
fnmatch 模块基础
fnmatch 模块提供了两个核心函数:fnmatch() 和 fnmatchcase()。它们允许使用 Shell 风格的通配符(如 *、?、[])对字符串进行模式匹配,而不仅仅局限于文件名。
通配符规则
*:匹配所有字符。?:匹配任意单个字符。[seq]:匹配 seq 中的任一字符。[!seq]:匹配不在 seq 中的任一字符。
大小写敏感性的关键差异
理解 fnmatch() 和 fnmatchcase() 的区别至关重要,这取决于你的运行环境和需求。
fnmatch():遵循文件系统规则
fnmatch() 的大小写匹配行为与底层文件系统一致:
- 在 Windows 系统上,文件名通常不区分大小写。因此,
fnmatch('mark.txt', '*.TXT')会返回True。 - 在 macOS/Linux 系统上,文件名通常区分大小写。因此,
fnmatch('mark.txt', '*.TXT')会返回False。
这意味着,如果你需要在跨平台环境中进行严格匹配,fnmatch() 的行为可能不一致。
fnmatchcase():严格区分大小写
若需完全根据提供的大小写进行匹配,应使用 fnmatchcase()。该函数在 Windows 和 Unix 系统上的行为一致,始终区分大小写。
from fnmatch import fnmatchcase
# 严格匹配,区分大小写
print(fnmatchcase('mark.txt', '*.TXT')) # 输出: False非文件名场景的应用示例
fnmatch 不仅限于文件名,还可用于处理任意字符串。以下示例展示了如何过滤一组街道地址数据。
地址过滤实战
假设有一组包含门牌号、街道名、城市和缩写的地址列表,我们需要筛选出符合特定模式的地址(例如:门牌号在 111-135 之间,且城市为北京 BJ)。
from fnmatch import fnmatchcase
# 原始地址数据
address = [
'111 A 上海 SH',
'112 B 上海 SH',
'113 C 上海 SH',
'124 D 北京 BJ',
'138 E 北京 BJ',
'145 F 北京 BJ',
]
# 使用 fnmatchcase 进行严格匹配
# 模式 '1[1-3][1-5]*BJ' 含义:
# 1: 以 1 开头
# [1-3]: 第二位数字在 1 到 3 之间
# [1-5]: 第三位数字在 1 到 5 之间
# *: 中间任意字符
# BJ: 以 BJ 结尾
result = [addr for addr in address if fnmatchcase(addr, '1[1-3][1-5]*BJ')]
print(result)运行上述代码,result 将包含:
['124 D 北京 BJ']注意:138 E 北京 BJ 未被选中,因为其门牌号第三位是 8,超出了 [1-5] 的范围。
总结
利用 fnmatch 模块,你可以轻松实现基于 Shell 通配符的字符串匹配。关键在于根据需求选择函数:fnmatch() 适用于模拟文件系统行为(注意平台差异),而 fnmatchcase() 适用于需要严格大小写控制的场景。通过列表推导式结合通配符模式,可以高效地过滤和提取目标数据。
以上就是 Python 利用 fnmatch 模块进行 Shell 风格字符串匹配的详细内容,更多关于 Python 字符串处理技巧的资料请关注本站其它相关文章!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













