J'essaie de construire une expression régulière pour le chemin ci-dessous. Pouvez-vous m'aider à construire des expressions rationnelles pour cela?

path  = "root-dir/document/2018/02/29/14/02-sample.txt"
pattern = '((a-z)+(-)(a-z)+/(a-z)+/(\d{4})/(\d{2})/(\d{2})/(\d{2})/(\d{2)(-)(a-z)+(.)(a-z)+)'
bool(re.match(pattern,path))

"root-dir/document/2015/01/25/13/01-sample.txt" //this should be accepted
"root-dir/2015/01/25/13/01-sample.txt" //this should not be accepted
"root-dir/document/201/01/25/13/01-sample.txt" //this should not be accepted as 201 part should be 4 digit
"root-dir/document/2015/01/2/13/01-sample.txt" //this should be not accepted as 2 part should be 2 digit
"root-dir/document/2015/01/25/13/sample.txt" //this should not be accepted as the last part should be something like this 03-sample.txt
-1
elyon 16 mars 2019 à 16:28

2 réponses

Meilleure réponse

Il y a peu de problèmes avec votre modèle, l'utilisation correcte est:

import re
pattern = r'([a-z]+(-)[a-z]+/[a-z]+/(\d{4})/(\d{2})/(\d{2})/(\d{2})/(\d{2})(-)[a-z]+(\.)[a-z]+)'
print(bool(re.match(pattern,path))) #True

Votre modèle '((a-z)+(-)(a-z)+/(a-z)+/(\d{4})/(\d{2})/(\d{2})/(\d{2})/(\d{2)(-)(a-z)+(.)(a-z)+)' ne fonctionne pas car:

  • \d{2) - vous devez fermer { avec } et non )
  • a-z - cela équivaut à n'importe quelle lettre minuscule à l'intérieur et uniquement à l'intérieur [ ] pas ( )
  • . - vous devez utiliser \. si vous voulez dire le caractère . (ASCII: 46) comme dans re cela signifie tout caractère qui n'est pas un retour à la ligne, n'oubliez pas non plus d'utiliser raw- chaîne plutôt que chaîne commune
1
Daweo 16 mars 2019 à 13:51

Si vous avez seulement besoin de voir si ce chemin est valide dans le sens où vous voulez savoir s'il existe, alors utilisez simplement:

import os

os.path.exists(path) # return true if the path exists
0
Neb 16 mars 2019 à 14:00