Python Regex pour correspondre à un fichier dans une liste de fichiers (erreur d'obtenir)
Question
Je suis en train d'utiliser une expression régulière en Python pour correspondre à un fichier (enregistré en tant que chaîne, soit « /volumes/footage/foo/bar.mov ») dans un fichier journal que je crée qui contient une liste de fichiers. Mais quand je lance le script, il me donne cette erreur: sre_constants.error: unbalanced parenthesis
. Le code J'utilise est la suivante:
Pour lire le fichier:
theLogFile = The_Root_Path + ".processedlog"
if os.path.isfile(theLogFile):
the_file = open(theLogFile, "r")
else:
open(theLogFile, 'w').close()
the_file = open(theLogFile, "r")
the_log = the_file.read()
the_file.close()
Ensuite, dans une boucle for
je réaffecter (je ne savais pas que je faisais jusqu'à ce que je posté cette question) la variable the_file
comme une chaîne à partir d'une liste de fichiers (obtenu en exécutant dans un dossier et il est des sous-ensembles et saisissant tous les noms de fichiers), puis essayez d'utiliser regex pour voir si le nom du fichier est présent dans le fichier journal:
for the_file in filenamelist:
p = re.compile(the_file, re.IGNORECASE)
m = p.search(the_log)
Chaque fois qu'il touche la partie re.compile()
du code, il recrache cette erreur. Et si j'essaie de couper que dehors, et utiliser re.search(the_file, the_log)
il crache encore sur cette erreur. Je ne comprends pas comment je pourrais être obtenir parenthèse non équilibrée de cette situation.
La solution
Gordon,
il me semble que la question est dans les données. Vous compilez des chaînes non inspectée de la filelist
dans regexp, ne pas avoir écouté ce qu'ils peuvent contenir des méta caractères pertinents pour le moteur regexp.
Dans votre boucle, ajoutez un print the_file
avant l'appel à re.compile (il n'y a aucun problème que vous réutilisez un nom comme iterator boucle appelée fichier objet avant), de sorte que vous pouvez voir quelles chaînes sont en fait venir de la liste de fichiers. Ou, mieux encore, exécutez toutes les instances de le_fichier par re.escape
avant de les transmettre à re.compile. Cela transforme tous les caractères meta en équivalent normal.
Autres conseils
Où est le modèle d'expression régulière? Essayez-vous d'utiliser les noms de fichiers contenus dans un fichier en tant que modèles pour rechercher l'autre fichier? Si oui, vous voulez parcourir the_file
avec someting comme
for the_pattern in the_file:
p = re.compile(the_pattern, re.IGNORECASE)
m = p.search(the_log)
...
Selon la documentation re.compile
Python , le premier argument de re.compile()
devrait être le modèle d'expression régulière sous forme de chaîne.
Mais la valeur de retour de open()
est un objet de fichier que vous attribuez à the_file
et passez à re.compile()
....
Qu'est-ce que vous liez nom the_file
dans votre premier extrait est un objet fichier , même si vous dites que est « enregistré en tant que chaîne », le nom du fichier (la chaîne) est en fait nommé theLogFile
mais ce que vous essayez t transformer en un objet RE est pas theLogFile
(la chaîne), il est the_file
(l'objet de fichier maintenant fermé). Compte tenu de cela, un peu bizarre de l'erreur (on attend d'un TypeError
), mais il est clair que vous obtenir une erreur à re.compile
.
le_fichier doit être une chaîne. Dans le le_fichier de code ci-dessus est la valeur de retour d'ouverture, qui est un objet de fichier.