re.compile(...).search avec plein de x; chercher les lignes d'un fichier dans un autre
4 réponses
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 \ ??
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
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 :)
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.
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
:
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@gmail.com :
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.
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
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 :)
Désolé pour le bruit et merci pour la réponse Laurent
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
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 :)
Désolé pour le bruit et merci pour la réponse Laurent
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
moky.math@gmail.com, 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.
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.