Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

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

4 réponses
Avatar
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=E8me est qu'un fichier LaTeX contient tr=E8s vite des ligne du =
type

=AB
Soient \( f\) et \( g\), les polyn=F4mes minimaux dans \( \eZ[X]\) de \( \x=
i\) et \( \xi^l\). Nous allons montrer que \( f=3Dg\) et donc que \( f=3Dg=
=3D\phi_n\). Supposons par l'absurde que \( f\neq g\). Dans ce cas ils sera=
ient des facteurs irr=E9ductibles distincts de \( \phi_n\) et il existerait=
un polyn=F4me \( h\) tel que \( \phi_n=3Dfgh\). A priori, \( h\in \eQ[X]\)=
parce que nous sommes justement en train de prouver que \( \phi_n\) est ir=
r=E9ductible dans \( \eQ[X]\). Quoi qu'il en soit, le lemme de Gauss \ref{L=
emEfdkZw} nous montre que \( h\in \eZ[X]\) parce que \( \phi_n\), \( f\) et=
\( g\) ont des coefficients entiers.
=BB
Bref, c'est un d=E9lice pour les =E9chappements ...


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

=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
import re
f=3Dopen("ess.tex") # fichier LaTeX
line=3Df.readline()
f.close()

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

for l in open("ess.tex"):
s=3Dsearch(l)
print s
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D

Cela ne trouve aucune r=E9sultat. Mais si je mets
search=3Dre.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=3Dre.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 =E0 re.search que l'on veut chercher=
une cha=EEne telle quelle avec tous les \ ??


Bonne soir=E9e
Laurent

4 réponses

Avatar
moky.math
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 :)
Avatar
Pierre Maurette
:
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
Avatar
moky.math
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
Avatar
Tanguy Ortolo
, 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