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

.* は gready マッチを実行するため、2 番目の部分は使用されません。

参考までに、通常の文字列操作で十分な正規表現を使用しないでください (単純な 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 に答える