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

python, regexp et extraction de mots

8 réponses
Avatar
remi
Bonjour,

Je suis newbie en python.
Je souhaiterais écrire un script qui me permette de récupérer dans un
fichier in.tex tous les titres. Dans in.tex, ils s'écrivent ainsi :
\section{phrase à récupérer et à écrire ailleurs}

J'ai essayé un code de ce type :

import re

file_in = open('in.tex','r')
file_sections = open('test_sections_liste.txt','w')

# affiche toutes les lignes du fichier et les stocke
# ds la variable lignes
lignes = file_in.readlines()

# on cherche en regexp (?) tous les titres de sections ]*)?>[\s\S]*
listes_sections = re.findall('section\{]*?>[\s\S]*\}',lignes)

# on imprime les titres de section dans un fichier
for i in listes_sections:
file_sections.write(i)

#fermeture et/ou ecriture des fichiers
file_in.close()
file_sections.close()

ça marche pas et j'ai le msg suivant :

File "tex2sql.py", line 20, in ?
listes_sections = re.findall('section\{]*?>[\s\S]*\}',lignes)
File "/usr/lib/python2.3/sre.py", line 166, in findall
return _compile(pattern, 0).findall(string)
TypeError: expected string or buffer

Une ou des idées ?
Merci.
Rémi.

8 réponses

Avatar
Yermat
Bonjour,

Je suis newbie en python.
Je souhaiterais écrire un script qui me permette de récupérer dans un
fichier in.tex tous les titres. Dans in.tex, ils s'écrivent ainsi :
section{phrase à récupérer et à écrire ailleurs}

J'ai essayé un code de ce type :

import re

file_in = open('in.tex','r')
file_sections = open('test_sections_liste.txt','w')

# affiche toutes les lignes du fichier et les stocke
# ds la variable lignes
lignes = file_in.readlines()


Ici lignes est une *liste* de String donc forcément à la ligne d'après
ça va pas aller !

Essayez :
listes_sections = []
for ligne in file_in
listes_sections.extend(re.findall('section{]*?>[sS]*}',ligne))

[...]


--
Yermat

Avatar
remi
Bonjour,

Bonjour,

Je suis newbie en python.


Je le suis toujours, mais le problème vient en fait des expressions
régulières... A moins qu'il y ait une autre façon sans utiliser le
module re.

Il faudrait juste que python prélève la string dans section{string} où
string est une phrase (un titre de paragraphe).

listes_sections = re.findall('section{]*?>[sS]*}',lignes)


Une idée ?
Merci
Rémi.

Avatar
bruno modulix
Yermat wrote:

Bonjour,

Je suis newbie en python.
Je souhaiterais écrire un script qui me permette de récupérer dans un
fichier in.tex tous les titres. Dans in.tex, ils s'écrivent ainsi :
section{phrase à récupérer et à écrire ailleurs}

J'ai essayé un code de ce type :

import re

file_in = open('in.tex','r')
file_sections = open('test_sections_liste.txt','w')

# affiche toutes les lignes du fichier et les stocke
# ds la variable lignes
lignes = file_in.readlines()



Ici lignes est une *liste* de String donc forcément à la ligne d'après
ça va pas aller !

Essayez :
listes_sections = []
for ligne in file_in
listes_sections.extend(re.findall('section{]*?>[sS]*}',ligne))

[...]



Ou :
listes_sections = [re.findall('section{]*?>[sS]*}',ligne)
for ligne in lignes]

Ce à quoi j'ajouterai deux conseils:

1/ utiliser une rawstring pour l'expression, c'est plus lisible (cf la
doc python, module re)

2/ compiler l'expression avant de l'utiliser, ça évite qu'elle le soit
(recompilée) à chaque tour de boucle.


HTH
--
bruno desthuilliers
python -c "print '@'.join(['.'.join([w[::-1] for w in p.split('.')]) for
p in ''.split('@')])"


Avatar
Yermat
bruno modulix wrote:
Yermat wrote:


[...]
Ou :


listes_sections = [re.findall('section{]*?>[sS]*}',ligne)
for ligne in lignes]


Ouais sauf que là, tu te retrouve avec une liste de liste de String :-D
Note que j'avais utiliser "extend" et non "append".

Ce à quoi j'ajouterai deux conseils:
[...]


Entièrement d'accord.

--
Yermat



Avatar
yves
On Tue, 15 Feb 2005 00:06:33 +0100, remi wrote:

Bonjour,

listes_sections = re.findall('section{]*?>[sS]*}',lignes)



Ca, ça ne te plait pas ?:
*********************
import re

file_in = open('in.tex','r')
file_sections = open('test_sections_liste.txt','w')

# affiche toutes les lignes du fichier et les stocke
# ds la variable lignes
# on cherche en regexp (?) tous les titres de sections ]*)?>[sS]*
# listes_sections = re.findall('section{]*?>[sS]*}',lignes)
listes_sections = []
for ligne in file_in:
listes_sections.extend(re.findall('section{.*}',ligne))

# on imprime les titres de section dans un fichier
for i in listes_sections:
file_sections.write(i[8:-1]+'n')

#fermeture et/ou ecriture des fichiers
file_in.close()
file_sections.close()

*******************
--
Yves


Avatar
yves
On Tue, 15 Feb 2005 11:19:51 GMT,
(Yves) wrote:

Moins mauvais:
voir
http://www.amk.ca/python/howto/regex/regex.html#SECTION000420000000000000000

#########################
import re

file_in = open('in.tex','r')
file_sections = open('test_sections_liste.txt','w')

# affiche toutes les lignes du fichier et les stocke
# ds la variable lignes
# on cherche en regexp (?) tous les titres de sections ]*)?>[sS]*
# listes_sections = re.findall('section{]*?>[sS]*}',lignes)
listes_sections = []
for ligne in file_in:
listes_sections.extend(re.findall('\section{.*}',ligne))

# on imprime les titres de section dans un fichier
for i in listes_sections:
file_sections.write(i[9:-1]+'n')

#fermeture et/ou ecriture des fichiers
file_in.close()
file_sections.close()
###############################

--
Yves
Avatar
bruno modulix
Yermat wrote:
bruno modulix wrote:


Ou :
listes_sections = [re.findall('section{]*?>[sS]*}',ligne)
for ligne in lignes]



Ouais sauf que là, tu te retrouve avec une liste de liste de String :-D
Note que j'avais utiliser "extend" et non "append".


oops ! Faudrait que je songe à dormir un peu un des ces jours !-)


--
bruno desthuilliers
python -c "print '@'.join(['.'.join([w[::-1] for w in p.split('.')]) for
p in ''.split('@')])"


Avatar
remi
On Tue, 15 Feb 2005 11:19:51 GMT,
[...]


Merci pour ces réponses ! C'est exactement ça et ça fonctionne.
Je vais pouvoir continuer à bricoler ma moulinette qui mange du *.tex
pour fabriquer du *.sql.
@+
Rémi.