J'ai une série de fichiers avec la convention de dénomination suivante ... "2020.01.01 w1 prévision.xlsm". J'essaie de boucler dans un répertoire lors de la recherche sur le modèle de titre de fichier qui correspond à l'année 2020 et au moins ou au moins une plage plus large (c'est-à-dire 2020-2030), donc je n'ai pas à modifier mon script chaque année. J'ai essayé ce qui suit mais j'ai échoué à obtenir le schéma pour faire correspondre autre chose que l'année en cours de 2020. La convention de dénomination commence avec la chaîne d'année. Sortie d'échantillon: p> Toute aide ou toute direction est grandement appréciée. p> p>
3 Réponses :
Je ne suis pas sûr à quelle distance vous voulez aller, mais si votre objectif est seulement d'identifier l'année dans une gamme de 2020-2030, il s'agit de votre expression régulière pour votre parcours complet: Parce que vous travaillez avec un chemin, je vous suggère de diviser votre chaîne sur le dernier slash peut-être que cela aidera: p> peut-être essayez-vous avec cette Je souhaite également ajouter plus d'informations sur les expressions régulières, de sorte que vous puissiez comprendre ce qui se passe . P> a. b. ^. * 20 (2 \ d | 30). * $ Code>. / code> avant d'utiliser le régulier expression sur le dernier élément de la liste. Que vous ne pouvez spécifier votre expression régulière pour le nom de fichier. P>
^ code> - Ceci recherche le début de la chaîne. La raison pour laquelle certaines réponses n'étaient pas couronnées de succès jusqu'à présent. P>
li>
. code> - cela cherche n'importe quel symbole. Vous pouvez donc facilement surmonter certaines parties inintéressantes. Mais soyez prudent, à cause de cela, vous devez spécifier un point comme celui-ci \. Code> p>
li>
$ code> - cela signifie la fin de la chaîne. P>
li>
\ d code> - Il s'agit d'un synonyme de chiffre et de correspondance [0-9] code> p> p>
li>
* code> - c'est le symbole gourmand. Cette trys correspondant à zéro à autant d'articles que possible du type recherché. Exemples: P>
. * code> - cela essaye de trouver autant de symboles que possible, aucun type ne définit. P>
\ d * code> - cette tâche de trouver autant de chiffres que possible. P>
li>
+ code> - c'est aussi un symbole gourmand mais doit correspondre au moins une fois. p>
li>
ol> p>
[2 \ d | 30] code> est une classe de caractères correspondant au caractère 1 B> dans la liste: 2, chiffres, tuyaux, 3, 0 code>
Merci d'avoir pris le temps de fournir une certaine direction. Je vais essayer aujourd'hui. C'est bizarre tout ce qui a été suggéré devrait fonctionner, mais les fichiers ne sont pas retournés pour une raison quelconque.
Dans votre deuxième motif, vous manquez un plutôt que p> Vous pouvez utiliser un site comme https://regexr.com/ pour expérimenter des regexes. P> Mais vous voudrez peut-être envisager de rechercher les fichiers les plus récents avec la logique de programmation au lieu de regexes, vous pouvez analyser le nom du fichier et sélectionner une plage de date, par exemple en utilisant à partir de votre code mis à jour: p> . code> wildcard après l'année, vous voulez probablement ^ (202 [0-9] | 2030). * Prévisions \ .xlsm code> p> ^ (202 [0-9] | 2030) * prévision.xlsm code> p> datetime code>. p>
mise à jour h2>
import datetime
path_str = '/Users/X/Desktop/Test_Directory/'
pattern_str = '*Forecast.xlsm' # All your report files
p = Path(path_str)
files = p.rglob(pattern_str)
for file in files:
# # uncomment in case there are different patterns in that folder:
# if not re.match(r"\d{4}\.\d{2}.\d{2}.*", file.name): continue
date = datetime.datetime.strptime(file.name[:10], "%Y.%m.%d")
current_year = datetime.datetime.today().year
if date > datetime.datetime(current_year, 1, 1):
print(date)
Merci pour votre réponse. J'ai mis à jour le message d'origine pour afficher le code de test et pour une raison quelconque, le seul modèle de retour des résultats est le simple simple énuméré. J'ai essayé tous les autres, y compris votre suggestion et rien n'est retourné. C'est la chose la plus étrange. Il ne semble pas y avoir de grands blancs ou d'espaces dans la convention de dénomination de fichiers non plus.
@ bbal20 J'ai lu ceci comme il y a plus de fichiers dans votre répertoire que votre sortie de sortie d'échantillon? Comme vous filtrez votre filtrage pour * 2020. * Prévistras.xlsm Code>, avec le Wildcard au début, il ne devrait pas y avoir de problème avec des caractères principaux. Je devrais deviner ici, peut-être une extension de fichier cachée comme ... prévision.xlsm.xlsm code>? Pourriez-vous répertorier certains des noms de fichiers de votre répertoire, y compris ceux qui devraient avoir été assortis mais non?
Sûr. Je ne fais donc que tester sur mon système de fichiers local, j'ai donc essayé de recréer avec des exemples de fichiers pour vous assurer que je tire dans les fichiers appropriés. Variations des noms de fichiers actuellement sont ... '2020.01.01 w1 prévision.xlsm', '2021.01.01 w1 prévision.xlsm', '2020.01.01w1 amortis rev.xlsm'. Je veux seulement les fichiers qui lisent "prévisions". Je suis capable de tirer dans des fichiers 2020 mais dès que j'essaie d'inclure toutes les méthodes suggérées ci-dessus, je ne reçois aucun fichier retourné dans ma boucle. Même lorsque je remplace le * au début par ^, il n'est pas possible de fonctionner. N'a de sens que moi.
Voici ce que vous recherchez: Il est dit Démarrer avec 2020 Thru 2099, suivi de tout caractère '^ 20 [2-9] [0-9]. + (\ \ xlsm) $' code> p> p> P>
. code> un ou plusieurs fois + code> et finissez par xlsm (\. xlsm) $ < / code>. Notez la barre oblique inverse dans la dernière partie. Il est nécessaire d'échapper à la période, sinon elle l'interrompt comme n'importe quel caractère. P>
Si vous ne voulez pas correspondre à 2020 mais à partir de 2021 - 2030, utilisez
202 [1-9] code>Merci pour votre commentaire. Je veux faire correspondre l'année en cours et toute plage plus grande. J'ai essayé la première chaîne de motif, mais cela ne ramasse pas le fichier que j'ai délibérément renommé pour lire "2021.01.01 ..." "
Je pense que cela devrait correspondre
^ 202 [0-9] \ b. * Prévisions \ an .xlsm $ code> REGEX101.COM/R/XQQBSCA/1 2> ou une gamme plus grande^ (?: 202 [0-9] | 20 [3-9] \ d) \ b. * Prévisions \ .xlsm $ code> Regex101.com/r/zuwyzi/1Si cela ne fonctionne pas, vous pouvez peut-être ajouter le code qui ne fonctionne pas pour vous à la question qui pourrait faciliter la recherche de la question.
pattern_str = '^ (20 [0-2] [0-9] | 20 [0-3] [0-0] [0-0]). * prévision.xlsm $' Ceci ne cherchera que l'année et la prévision.xlsm à la fin du nom de fichier Regex101.com/r/zes9df/1
J'ai mis à jour le message d'origine avec un extrait de code de test pour tester si les suggestions fonctionnent. Pour une raison quelconque, seuls les résultats de rendement répertoriés par la tendance. Tous les autres ont suggéré de ne pas surtout quand on utilise le ^ au début. J'ai remarqué cela lorsque vous avez testé certaines de mes propres solutions. Il ne semble pas y avoir un espace de pointe dans la convention de dénomination non plus.
@Thefourthbird mis à jour pour inclure l'extrait de test. Toutes les autres suggestions ne semblent pas retourner des résultats.
@ bbal20 tu veux dire comme ça?
^. * 202 [0-9] \ b. * Prévisions \ an .xlsm $ code> Regex101.com/r/yu6oyd/1@ Bbal20 ou un peu plus spécifique
^. * \ b202 [0-9] \. (?: 1 [0-2] | 0 [1-9]) \. (?: 3 [01] | 12] [0-9] | 0 [1-9]) Semaine (?: 5 [0-3] | [1-4] [0-9] | 0? [1-9]) Prévisions \ .xlsm $ code> Regex101.com/r/ekwwpz/1