Python Regex pour correspondre à un fichier dans une liste de fichiers (erreur d'obtenir)

StackOverflow https://stackoverflow.com/questions/2344193

  •  23-09-2019
  •  | 
  •  

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.

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top