1

我正在尝试以 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

4 回答 4

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']
于 2010-10-15T09:54:04.807 回答
1

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

.* 执行匹配,因此永远不会使用第二部分。

仅供参考,在我的观点中,您不应该在正常的字符串操作就足够的情况下使用正则表达式(简单的 split() 就可以了)。

于 2010-10-15T09:52:43.800 回答
1

删除最外层的组并将其放在-组之间:

>>> DATE_NAME_PATTERN = re.compile(r'(.*)-([0-9]{8})?\.txt')
>>> DATE_NAME_PATTERN.match("myfile-20101019.txt").groups()
('myfile', '20101019')
于 2010-10-15T09:53:47.553 回答
0

不要为此使用正则表达式:

import os

basename, extension= os.path.splitext(filename)
namepart, _, isodate= basename.rpartition('-')

我建议rpartition因为 isodate(如您的问题中所定义)不包含破折号。

于 2010-10-15T14:21:12.520 回答