2010-10-15 4 views
0

Je suis en train de faire correspondre les noms de fichiers dans le format fichier-isodate.txtPython expression régulière pour correspondre fichier date.txt

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

Cependant je dois obtenir le nom de fichier et les parties -isodate en groupes séparés.

Toutes les suggestions et/ou explainations seraient appréciés

Répondre

1

Vous avez besoin:. DATE_NAME_PATTERN = re.compile("((.*?)(-[0-9]{8})?)\\.txt")

* effectue un match Gready de sorte que la deuxième partie est jamais utilisée. À mon avis, vous ne devriez pas utiliser l'expression régulière où la manipulation normale de la chaîne est suffisante (split simple() fera l'affaire).

+0

Merci, remplacez * par non greed. *? et ça marche. J'aurais dû repérer ça! –

1

Retirez le groupe à l'extérieur et mettre le - entre les groupes:

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

Si vous connaissez le format de fichier ne changera pas, vous n'avez pas besoin re:

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


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

ou tout simplement sans extension:

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

Fonctionne avec plus compliqué filenam es trop:

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

Ou, pour diviser l'extension encore plus bien:

import os 

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

Dans notre situation, l'utilisation est meilleure dans notre situation, car nous utilisons beaucoup d'expressions régulières pour correspondre à différents formats de noms de fichiers. Merci quand même –

0

Ne pas utiliser des expressions régulières pour cela:

import os 

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

Je suggère rpartition depuis l'isodate (tel que défini dans votre question) ne contiendra pas de tirets .

Questions connexes