匹配file-date.txt的Python正则表达式

1 投票
4 回答
1940 浏览
提问于 2025-04-16 05:32

我正在尝试匹配文件名,格式是 filename-isodate.txt。

>>> DATE_NAME_PATTERN = re.compile("((.*)(-[0-9]{8})?)\\.txt")
>>> DATE_NAME_PATTERN.match("myfile-20101019.txt").groups()
('myfile-20101019', 'myfile-20101019', None)

不过,我需要把文件名和 -isodate 这两部分分开提取出来。

如果有任何建议或者解释,我会非常感激。

4 个回答

1

去掉最外层的分组,然后在各个分组之间加上一个-

>>> DATE_NAME_PATTERN = re.compile(r'(.*)-([0-9]{8})?\.txt')
>>> DATE_NAME_PATTERN.match("myfile-20101019.txt").groups()
('myfile', '20101019')
2

如果你确定文件名的格式不会改变,那就不需要用到 re 这个模块:

filename = 'myfile-20101019.txt'
basename, extension = filename.rsplit('.', 1)
firstpart, date = basename.rsplit('-', 1)


In : firstpart, date, extension
Out: ('myfile', '20101019', 'txt')

或者可以直接处理没有扩展名的情况:

firstpart, date = filename.rsplit('.', 1)[0].rsplit('-', 1)
# ['myfile', '20101019']

这个方法也适用于更复杂的文件名:

filename = 'more.complicated-filename-20101004.txt'
firstpart, date = filename.rsplit('.', 1)[0].rsplit('-', 1)
# ['more.complicated-filename', '20101004']

或者,可以更好地分离文件扩展名:

import os

filename = 'more.complicated-filename-20101004.txt'
firstpart, date = os.path.splitext(filename)[0].rsplit('-', 1)
# ['more.complicated-filename', '20101004']
1

你需要这样一个代码:DATE_NAME_PATTERN = re.compile("((.*?)(-[0-9]{8})?)\\.txt")

这里的.*是一个贪婪匹配,这意味着它会尽量多地匹配字符,所以后面的部分就不会被用到。

顺便说一下,我觉得在普通的字符串处理足够的时候,不应该用正则表达式(简单的split()就可以了)。

撰写回答