# Expression régulière recherche sur plusieurs ligne

**URL:** <https://www.debian-fr.org/t/expression-reguliere-recherche-sur-plusieurs-ligne/68133>\
**Category:** Programmation\
**Created:** [Février 21, 2016, 10:16 UTC](https://www.debian-fr.org/t/expression-reguliere-recherche-sur-plusieurs-ligne/68133 "2016-02-21T22:16:14Z")\
**Posts on this page:** 16\
**Page:** 1

<div class="post-metadata">

**Author:** ![Arisoy](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/a/13edae/32.png) [@Arisoy](https://www.debian-fr.org/u/Arisoy)\
**Post date:** [Février 21, 2016, 10:16 UTC](https://www.debian-fr.org/t/expression-reguliere-recherche-sur-plusieurs-ligne/68133/1 "2016-02-21T22:16:14Z")

</div>

Bonjour,

J’ai besoin de rechercher dans un document texte tous ce qui se trouve entre ‘\<td id=’ et ’

J’ai donc écris cette expression `test = re.findall("<td id=.*</td>", text)` (je suis en python)

Seulement cette expression ne fonctionne pas car le texte qui se trouve entre ‘\<td id=’ et ’ est sur plusieurs ligne. Or mon expression ne permet que de rechercher sur une seule ligne.

Quelqu’un peut m’aider à la modifier pour que la recherche soit bien effective sur plusieurs lignes?

---

<div class="post-metadata">

**Author:** ![limax](https://www.debian-fr.org/user_avatar/www.debian-fr.org/limax/32/3886_2.png) [@limax](https://www.debian-fr.org/u/limax)\
**Post date:** [Février 21, 2016, 10:16 UTC](https://www.debian-fr.org/t/expression-reguliere-recherche-sur-plusieurs-ligne/68133/2 "2016-02-21T22:16:14Z")

</div>

Bonjour

Essaye avec re.MULTILINE [docs.python.org/3/library/re.html#re.MULTILINE](https://docs.python.org/3/library/re.html#re.MULTILINE)

---

<div class="post-metadata">

**Author:** ![Arisoy](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/a/13edae/32.png) [@Arisoy](https://www.debian-fr.org/u/Arisoy)\
**Post date:** [Février 21, 2016, 10:16 UTC](https://www.debian-fr.org/t/expression-reguliere-recherche-sur-plusieurs-ligne/68133/3 "2016-02-21T22:16:14Z")

</div>

Je viens d’éssayer

```auto

```

et

```auto

```

Aucun des deux ne fonctionne. Les lignes entre mes expressions sont toujours ignorées.

---

<div class="post-metadata">

**Author:** ![Mimoza](https://www.debian-fr.org/user_avatar/www.debian-fr.org/mimoza/32/3858_2.png) [@Mimoza](https://www.debian-fr.org/u/Mimoza)\
**Post date:** [Février 21, 2016, 10:16 UTC](https://www.debian-fr.org/t/expression-reguliere-recherche-sur-plusieurs-ligne/68133/4 "2016-02-21T22:16:14Z")

</div>

et au lieu de «._» tu mettais «[a-zA-Z0-9\n\t]_» comme ça tu y inclus explicitement les retours à la ligne et les tabulations.

---

<div class="post-metadata">

**Author:** ![Arnaud](https://www.debian-fr.org/user_avatar/www.debian-fr.org/arnaud/32/4098_2.png) [@Arnaud](https://www.debian-fr.org/u/Arnaud)\
**Post date:** [Février 21, 2016, 10:16 UTC](https://www.debian-fr.org/t/expression-reguliere-recherche-sur-plusieurs-ligne/68133/5 "2016-02-21T22:16:14Z")

</div>

Je pense que c’est plutôt re.DOTALL dont tu as besoin, pour inclure tous les caractères de saut de lignes, retour chariot, etc …

---

<div class="post-metadata">

**Author:** ![limax](https://www.debian-fr.org/user_avatar/www.debian-fr.org/limax/32/3886_2.png) [@limax](https://www.debian-fr.org/u/limax)\
**Post date:** [Février 21, 2016, 10:16 UTC](https://www.debian-fr.org/t/expression-reguliere-recherche-sur-plusieurs-ligne/68133/6 "2016-02-21T22:16:15Z")

</div>

oui c’est bien re.DOTALL. ![:033](https://www.debian-fr.org/uploads/default/original/1X/42cd8bd0447ecac24cdff1e26fa990a5c8442791.gif "petard")

---

<div class="post-metadata">

**Author:** ![seb-ksl](https://www.debian-fr.org/user_avatar/www.debian-fr.org/seb-ksl/32/2946_2.png) [@seb-ksl](https://www.debian-fr.org/u/seb-ksl)\
**Post date:** [Février 21, 2016, 10:16 UTC](https://www.debian-fr.org/t/expression-reguliere-recherche-sur-plusieurs-ligne/68133/7 "2016-02-21T22:16:17Z")

</div>

Si c’est un page HTML que tu parses, il existe plein de librairies plus haut niveau pour t’aider, à commencer par [BeautifulSoup](http://www.crummy.com/software/BeautifulSoup/)

---

<div class="post-metadata">

**Author:** ![Arisoy](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/a/13edae/32.png) [@Arisoy](https://www.debian-fr.org/u/Arisoy)\
**Post date:** [Février 21, 2016, 10:16 UTC](https://www.debian-fr.org/t/expression-reguliere-recherche-sur-plusieurs-ligne/68133/8 "2016-02-21T22:16:20Z")

</div>

> [@Arnaud\_](#):
>
> Je pense que c’est plutôt re.DOTALL dont tu as besoin, pour inclure tous les caractères de saut de lignes, retour chariot, etc …

Effectivement avec DOTALL je peux effectivement récupérer plusieurs ligne. Par contre le résultat obtenu n’est pas celui attendu 🙂

En effet, j’ai plusieurs balises identiques qui se suivent,

\<td id= [...] \<td id= [...] \<td id= [...] \<td id= [...]

J’aurais voulu récupérer le contenu de chaque td dans un tableau or cette ligne `re.findall("<td id=.*</td>", r.text, re.DOTALL)` me récupère tout de la balise 1 à la balise X…

> [@seb-ksl](#):
>
> Si c’est un page HTML que tu parses, il existe plein de librairies plus haut niveau pour t’aider, à commencer par [BeautifulSoup](http://www.crummy.com/software/BeautifulSoup/)

Oui c’est bien une page html qui est concernée. Je suis entrain d’essayer BeautifulSoup en parallèle de mes essais avec les regex mais pour l’instant je n’arrive à rien 🙂

---

<div class="post-metadata">

**Author:** ![Arnaud](https://www.debian-fr.org/user_avatar/www.debian-fr.org/arnaud/32/4098_2.png) [@Arnaud](https://www.debian-fr.org/u/Arnaud)\
**Post date:** [Février 21, 2016, 10:16 UTC](https://www.debian-fr.org/t/expression-reguliere-recherche-sur-plusieurs-ligne/68133/9 "2016-02-21T22:16:21Z")

</div>

C’est parce que ton expression régulière est gloutonne.  
Avec des balises HTML, cela se résout simplement :

```auto

```

( n’importe quel caractère sauf “\<”, plusieurs fois ).

---

<div class="post-metadata">

**Author:** ![Arisoy](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/a/13edae/32.png) [@Arisoy](https://www.debian-fr.org/u/Arisoy)\
**Post date:** [Février 21, 2016, 10:16 UTC](https://www.debian-fr.org/t/expression-reguliere-recherche-sur-plusieurs-ligne/68133/10 "2016-02-21T22:16:21Z")

</div>

[quote=“Arnaud\_”]C’est parce que ton expression régulière est gloutonne.  
Avec des balises HTML, cela se résout simplement :

```auto

```

( n’importe quel caractère sauf “\<”, plusieurs fois ).[/quote]

La mienne est peut être gloutonne mais la tienne ne me retourne rien du tout 🙂

---

<div class="post-metadata">

**Author:** ![Arnaud](https://www.debian-fr.org/user_avatar/www.debian-fr.org/arnaud/32/4098_2.png) [@Arnaud](https://www.debian-fr.org/u/Arnaud)\
**Post date:** [Février 21, 2016, 10:16 UTC](https://www.debian-fr.org/t/expression-reguliere-recherche-sur-plusieurs-ligne/68133/11 "2016-02-21T22:16:21Z")

</div>

Ah bon ?

[code]import re

text = “”"

abc

abc

abc

abc

def ghi

ghi  
ghi

"""

print(re.findall("\<td id=[^\<]\*", text, re.DOTALL))

## Affiche :

## [‘abc\n\nabc\n\nabc\n\nabc’, ‘def’, ‘ghi\n\nghi\nghi’][/code]

Ce code fonctionne parfaitement chez moi ( python 3.5.1 ).

---

<div class="post-metadata">

**Author:** ![Arisoy](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/a/13edae/32.png) [@Arisoy](https://www.debian-fr.org/u/Arisoy)\
**Post date:** [Février 21, 2016, 10:16 UTC](https://www.debian-fr.org/t/expression-reguliere-recherche-sur-plusieurs-ligne/68133/12 "2016-02-21T22:16:22Z")

</div>

Voici un extrait de ce que j’essaie de récupérer :

[code]

  
**» 27th Wednesday**

[Shadowhunters](https://www.debian-fr.org/cat/Shadowhunters-summary)  
Dead Man's Party   
[S: 1 - Ep: 3](https://www.debian-fr.org/cat/Shadowhunters/Season-1/Episode-3)  
 Freeform - 3:00am

[The Expanse](https://www.debian-fr.org/cat/The-Expanse-summary)  
Salvage   
[S: 1 - Ep: 8](https://www.debian-fr.org/cat/The-Expanse/Season-1/Episode-8)  
 Syfy - 4:00am

[The Shannara Chronicles](https://www.debian-fr.org/cat/The-Shannara-Chronicles-summary)  
Reaper   
[S: 1 - Ep: 5](https://www.debian-fr.org/cat/The-Shannara-Chronicles/Season-1/Episode-5)  
 MTV - 4:00am

**» 28th Thursday**** » 29th Friday**

[Legends of Tomorrow](https://www.debian-fr.org/cat/DCs-Legends-of-Tomorrow-summary)  
Pilot, Part 2   
[S: 1 - Ep: 2](https://www.debian-fr.org/cat/DCs-Legends-of-Tomorrow/Season-1/Episode-2)  
 The CW - 2:00am

[The 100](https://www.debian-fr.org/cat/The-100-summary)  
Wanheda (2)   
[S: 3 - Ep: 2](https://www.debian-fr.org/cat/The-100/Season-3/Episode-2)  
 The CW - 3:00am

**» 30th Saturday** [/code]

Le site donne les horaires de diffusion de certaines séries. A terme je veux récupérer la date de diffusion, la chaine, le nom de la série, l’épisode, le numéro de la saison et le numéro de l’épisode.

Ce premier regex que je fais doit me donner tous ce qui se trouve dans la classe “day” afin que je puisse par la suite avec d’autre regex récupérer les infos qui m’intéressent.

Et la ton regex ne fonctionne pas. Après peut être que les expressions régulières ne marche pas pour faire ce que je veux…

---

<div class="post-metadata">

**Author:** ![Arnaud](https://www.debian-fr.org/user_avatar/www.debian-fr.org/arnaud/32/4098_2.png) [@Arnaud](https://www.debian-fr.org/u/Arnaud)\
**Post date:** [Février 21, 2016, 10:16 UTC](https://www.debian-fr.org/t/expression-reguliere-recherche-sur-plusieurs-ligne/68133/13 "2016-02-21T22:16:22Z")

</div>

Effectivement cela ne marche pas si tu veux récupérer des balises à l’intérieur du td.

On peut ôter l’effet glouton de cette façon :

```auto

```

Dans ton exemple, la dernière balise td n’est pas fermée correctement, donc cela ne renverra que 3 contenus.

---

<div class="post-metadata">

**Author:** ![limax](https://www.debian-fr.org/user_avatar/www.debian-fr.org/limax/32/3886_2.png) [@limax](https://www.debian-fr.org/u/limax)\
**Post date:** [Février 21, 2016, 10:16 UTC](https://www.debian-fr.org/t/expression-reguliere-recherche-sur-plusieurs-ligne/68133/14 "2016-02-21T22:16:22Z")

</div>

Avec beautifulsoup.  
Ref: [sametmax.com/parser-du-html-avec-beautifulsoup/](http://sametmax.com/parser-du-html-avec-beautifulsoup/)

`from urllib2 import urlopen
import bs4 as BeautifulSoup
html = urlopen('http://www.d8.tv/d8-series/pid6654-d8-longmire.html').read()
soup = BeautifulSoup.BeautifulSoup(html)`

et après un truc comme

```auto

```

C’est quoi le lien de ton site?

---

<div class="post-metadata">

**Author:** ![Arisoy](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/a/13edae/32.png) [@Arisoy](https://www.debian-fr.org/u/Arisoy)\
**Post date:** [Février 21, 2016, 10:16 UTC](https://www.debian-fr.org/t/expression-reguliere-recherche-sur-plusieurs-ligne/68133/15 "2016-02-21T22:16:22Z")

</div>

[quote=“Arnaud\_”]Effectivement cela ne marche pas si tu veux récupérer des balises à l’intérieur du td.

On peut ôter l’effet glouton de cette façon :

```auto

```

Dans ton exemple, la dernière balise td n’est pas fermée correctement, donc cela ne renverra que 3 contenus.[/quote]  
Effectivement dans l’exemple elle n’est pas fermé mais sur le site elle l’est bien. En tous cas cette fois ta regex fonctionne.  
Mais je ne la comprends pas trop. Le ? signifie 0 ou 1 je n’arrive pas a comprendre comment il agit sur cette règle…

[quote=“limax”]Avec beautifulsoup.  
Ref: [sametmax.com/parser-du-html-avec-beautifulsoup/](http://sametmax.com/parser-du-html-avec-beautifulsoup/)

`from urllib2 import urlopen
import bs4 as BeautifulSoup
html = urlopen('http://www.d8.tv/d8-series/pid6654-d8-longmire.html').read()
soup = BeautifulSoup.BeautifulSoup(html)`

et après un truc comme

```auto

```

C’est quoi le lien de ton site?[/quote]  
Le site est ici : [http://www.pogdesign.co.uk/cat/](http://www.pogdesign.co.uk/cat/)

Je viens de testé avec ta ligne de beautifulsoup et effectivement elle me ressort bien les infos qui m’intéressent. Seulement contrairement à la regex je me retrouve avec toutes les infos à la suite et non dans un tableau. Il est donc plus compliqué pour moi de récupérer les infos qui m’intéressent au final (voir mon post juste au-dessus). A moins que la beautifulsoup me permettent aussi d’aller piocher les infos qui m’intéressent.

Comme je l’ai dit, au final j’ai besoin d’extraire pour chaque épisode les infos suivantes : Date de passage, heure de passage, nom de la série, nom de l’épisode, chaine sur laquelle ça passe, numéro de la saison et numéro de l’épisode.

---

<div class="post-metadata">

**Author:** ![Arnaud](https://www.debian-fr.org/user_avatar/www.debian-fr.org/arnaud/32/4098_2.png) [@Arnaud](https://www.debian-fr.org/u/Arnaud)\
**Post date:** [Février 21, 2016, 10:16 UTC](https://www.debian-fr.org/t/expression-reguliere-recherche-sur-plusieurs-ligne/68133/16 "2016-02-21T22:16:22Z")

</div>

> [@snake57](#):
>
> Mais je ne la comprends pas trop. Le ? signifie 0 ou 1 je n’arrive pas a comprendre comment il agit sur cette règle…

Dans ce cas, le «&nbsp;?&nbsp;» n’est pas à prendre tout seul, c’est la combinaison «&nbsp;\*?&nbsp;» qui signifie : prendre la chaîne de taille minimale correspondant à la regexp.

Voir ici : [docs.python.org/3.5/library/re.html](https://docs.python.org/3.5/library/re.html)

[quote]_?, +?, ??  
The '_', ‹&nbsp;+&nbsp;›, and ‹&nbsp;?&nbsp;› qualifiers are all greedy; they match as much text as possible. Sometimes this behaviour isn’t desired; if the RE \<._\> is matched against ‹&nbsp;_

# _title_
_&nbsp;›, it will match the entire string, and not just ‹&nbsp;_
# _&nbsp;›. Adding ‹&nbsp;?&nbsp;› after the qualifier makes it perform the match in non-greedy or minimal fashion; as few characters as possible will be matched. Using ._? in the previous expression will match only ‹&nbsp;

# &nbsp;›.[/quote]

Que ce soit avec le module re ou BeautifulSoup, il faut du temps pour comprendre le fonctionnement, mais pour avoir un gain de temps considérable par la suite.  
Dans le cadre de «&nbsp;webscraping&nbsp;», il faut que tu t’attendes à ce que le site change de structure, ce qui t’obligera à t’adapter tout le temps.
