re.compile(...).search avec plein de x; chercher les lignes d'un fichier dans un autre

Le
moky.math
Bonjour


Mon but est de chercher dans des fichiers (LaTeX) des lignes que j'aie da=
ns un autre fichier LaTeX.

Le problème est qu'un fichier LaTeX contient très vite des ligne du =
type

«
Soient ( f) et ( g), les polynômes minimaux dans ( eZ[X]) de ( x=
i) et ( xi^l). Nous allons montrer que ( f=g) et donc que ( f=g=
=phi_n). Supposons par l'absurde que ( feq g). Dans ce cas ils sera=
ient des facteurs irréductibles distincts de ( phi_n) et il existerait=
un polynôme ( h) tel que ( phi_n=fgh). A priori, ( hin eQ[X])=
parce que nous sommes justement en train de prouver que ( phi_n) est ir=
réductible dans ( eQ[X]). Quoi qu'il en soit, le lemme de Gauss ef{L=
emEfdkZw} nous montre que ( hin eZ[X]) parce que ( phi_n), ( f) et=
( g) ont des coefficients entiers.
»
Bref, c'est un délice pour les échappements


Voici ce que j'ai fait. Dans cet exemple, "ess.tex" est un fichier qui cont=
ient par exemple seulement la ligne citée plus haut.

==

import re
f=open("ess.tex") # fichier LaTeX
line=f.readline()
f.close()

search=re.compile(re.escape(line)).search

for l in open("ess.tex"):
s=search(l)
print s
==
==
=

Cela ne trouve aucune résultat. Mais si je mets
search=re.compile(line).search
sans le re.escape() alors cette ligne plante assez logiquement avec :

Traceback (most recent call last):
File "./ess.py", line 10, in <module>
search=re.compile(line).search
File "/usr/lib/python2.7/re.py", line 190, in compile
return _compile(pattern, flags)
File "/usr/lib/python2.7/re.py", line 242, in _compile
raise error, v # invalid expression
sre_constants.error: bogus escape: '\x'


Est-ce que quelqu'un sait comment dire à re.search que l'on veut chercher=
une chaîne telle quelle avec tous les ??


Bonne soirée
Laurent
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
moky.math
Le #24639821
Après de nouveaux essais, je remarque que le problème est (presque) s ûrement dans les lettres accentuées (é,è,ô, etc).
Ça ne résout pas mon problème, mais ça me donne des idées pour av ancer.

Je reste ouvert à toute proposition :)
Pierre Maurette
Le #24639811
:
Bonjour


Mon but est de chercher dans des fichiers (LaTeX) des lignes que j'aie dans
un autre fichier LaTeX.

Le problème est qu'un fichier LaTeX contient très vite des ligne du type

«
Soient ( f) et ( g), les polynômes minimaux dans ( eZ[X]) de ( xi)
et ( xi^l). Nous allons montrer que ( f=g) et donc que ( f=g=phi_n).
Supposons par l'absurde que ( fneq g). Dans ce cas ils seraient des
facteurs irréductibles distincts de ( phi_n) et il existerait un polynôme
( h) tel que ( phi_n=fgh). A priori, ( hin eQ[X]) parce que nous
sommes justement en train de prouver que ( phi_n) est irréductible dans (
eQ[X]). Quoi qu'il en soit, le lemme de Gauss ref{LemEfdkZw} nous montre
que ( hin eZ[X]) parce que ( phi_n), ( f) et ( g) ont des
coefficients entiers. » Bref, c'est un délice pour les échappements ...


Voici ce que j'ai fait. Dans cet exemple, "ess.tex" est un fichier qui
contient par exemple seulement la ligne citée plus haut.

======================================= > import re
f=open("ess.tex") # fichier LaTeX
line=f.readline()
f.close()

search=re.compile(re.escape(line)).search

for l in open("ess.tex"):
s=search(l)
print s
==================================================


Je n'utilise pas le 'l' (L minuscule) dans mes sources ;-)


Cela ne trouve aucune résultat.



J'ai testé vite fait, ça marche. Debian (python 2.6) et Windows (python
2.7) dans les deux cas sous Eclipse - Pydev, fichier d'essai éditeur
Eclipse (utf-8) et bloc_note (ANSI); copié collé de votre message à
partir de Google-Groups.
Vous pourriez déjà affiner le diagnostic:
- Valider le test avec un fichier ess.txt d'abord très simple,
caractères pur ASCII sans ponctuation ni antislash, une ligne puis
plusieurs.
- Imprimer line.
- Remplacer /print s/ par
if s is not None:
print s.group()

Après, j'imagine que vous souhaitez faire autre chose dans votre code,
puisque les expressions régulières pour tester la similarité brute de
deux chaines, c'est un peu toomuch, et vous devriez retrouver sans
problème une ligne de fichier dans le fichier lui-même.

Je ne connais pas Latex (c'est une lacune) mais la première question
que je me pose est de savoir si le même objet (une /ligne/) a une
représentation unique sur le disque, j'ai envie de répondre par la
négative, à l'instar de HTML ou XML.

Mais avant de descendre plus bas (lecture binaire et recherche de blocs
à l'identique) ou de monter plus haut (parser Latex, normalisation ?) ,
il faut à mon avis faire fonctionner votre bout de test.

[...]

Bonne soirée



Bonne journée...

--
Pierre Maurette
moky.math
Le #24643811
Effectivement l'exemple que j'ai donné était un des rares qui fonctionn aient. Après un peu de travail, j'ai remarqué que le problème n'éta it absolument pas dans l'expression rationnelle, mais bien tout dans l'enco dage.

J'ai donc ajouté
from __future__ import unicode_literals
et changé tous les open(...) en codecs.open(...,encoding="utf8")
Puis mettant un peu de encode et decode, ça passe :)

Au cas où quelqu'un tomberais sur ce post avec des mots-clefs comme "unic ode" ou "codecs", voici le lien qui m'a tout appris :
http://dl.afpy.org/pycon-fr-09/Comprendre_les_erreurs_unicode.pdf


Désolé pour le bruit et merci pour la réponse
Laurent
Tanguy Ortolo
Le #24644361
, 2012-07-14 21:05+0200:
Mon but est de chercher dans des fichiers (LaTeX) des lignes que j'aie dans un autre fichier LaTeX.

[…]

Voici ce que j'ai fait. Dans cet exemple, "ess.tex" est un fichier qui contient par exemple seulement la ligne citée plus haut.

======================================= > import re
f=open("ess.tex") # fichier LaTeX
line=f.readline()
f.close()

search=re.compile(re.escape(line)).search

for l in open("ess.tex"):
s=search(l)
print s
==================================================


Si j'ai bien compris, tu recherches une chaîne de caractère exacte.
Pour une telle recherche, utiliser des expressions rationnelles est
contre-productif, il serait à mon avis plus simple et plus efficace
d'utiliser la méthode find() des chaînes de caractères.

--
Tanguy Ortolo
Publicité
Poster une réponse
Anonyme