使用glob匹配以数字和下划线开头的文件名。

3

起初,我尝试了

folder_path.glob('[0-9]_*.json')

当文件名以单个数字开头时,该方法仅适用于文件路径为pathlib.Path对象的情况。

在找不到合适的匹配模式后,我使用了一个额外的条件来验证下划线前面的字符是否是数字字符串。

[ file_path for file_path in folder_path.glob('*_*.json') if file_path.name.split('_')[0].isnumeric() ]

但这似乎只是适用于此特定情况的一种变通方法。是否有更好的方式可以使用 glob 来匹配任意长度的数字?


不幸的是,glob 不像 regex 那样灵活。一个解决方法可能是编写 folder_path.glob('[0-9]_.json') - 这样它就可以匹配任何以数字开头的文件。 - teambob
2个回答

1
使用正则表达式匹配路径:
import re

res = [file_path for file_path in folder_path.glob('[0-9]*_*.json') if re.match(r"[0-9]+_.*\.json", str(file_path))]
print(res)

输出 (示例)

[PosixPath('123_abc.json')]

Python的glob模块遵循Unix shell使用的规则,来自文档

根据Unix shell使用的规则,glob模块找到与指定模式匹配的所有路径名,尽管结果以任意顺序返回。

Unix shell的规则可以在这里找到,但这些规则不包括变量模式长度,就像您的情况一样。


很遗憾,Python的glob()函数似乎不支持此功能。它比bash更受限制。这是它的代码:https://github.com/python/cpython/blob/main/Lib/glob.py - teambob

1

您的解决方案很好。当全局模式无法工作时,请编写自己的模式。全局模式是为了在shell中更轻松地查找文件而发明的,但在表达能力和易用性之间存在折衷。 pathlib 将您的全局模式转换为正则表达式,您也可以这样做。pathlib 使用底层的 os.listdiros.scandir 实用程序,但您也可以坚持使用 Path.iterdir

import re

my_glob = re.compile(r"\d+_").match
[file_path for file_path in folder_path.iterdir() if my_glob(file_path.name)]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接