Supposons que j'ai un texte comme celui-ci:
<li>pizza</li><li>burgers</li><li>fries</li>
Je souhaite utiliser une seule expression régulière pour extraire tout le texte entre les balises / list en utilisant python.
<li>pizza</li>
Cela ne renvoie que le premier élément de la liste entouré des balises / list:
regexp = <p>.+?(<li>.+?</li>).+?</p>
Y a-t-il un moyen pour moi de récupérer tous les éléments entre les balises / list afin que ma sortie ressemble à:
<p>Joe likes <ul><li>pizza</li>, <li>burgers</li>, and <li>fries</li></ul></p>
4 Réponses :
Cela devrait fonctionner:
import re
source = '<p>Joe likes <ul><li>pizza</li>, <li>burgers</li>, and <li>fries</li></ul></p>'
res = ''.join(re.findall('<li>[^<]*</li>', source))
# <li>pizza</li><li>burgers</li><li>fries</li>
Merig. Merci. Très bonne réponse. Mais, pour mes besoins très spécifiques, cela ne résoudra pas mon problème. Un moyen d'extraire le texte entre les balises li en utilisant uniquement regex (sans recourir à d'autres fonctions python)?
En supposant que vous ayez déjà extrait la chaîne d'exemple, vous déclarez pouvoir faire:
import re
s = "<p>Joe likes <ul><li>pizza</li>, <li>burgers</li>, and <li>fries</li></ul></p>"
re.findall("<li>.+?</li>", s)
Output:
['<li>pizza</li>', '<li>burgers</li>', '<li>fries</li>']
Pourquoi avez-vous besoin des balises ?
import re
source = '<p>Joe likes <ul><li>pizza</li>, <li>burgers</li>, and <li>fries</li></ul></p> and also <li>coke</li>'
ss = re.findall('<p>(.+?)</p>',source)
for s in ss:
m = re.findall('(<li>.+?</li>)',s)
print m
renvoie ce que vous voulez.
Modifier strong >
Si vous ne voulez que du texte entre les balises , vous pouvez le faire en deux étapes:
import re
source = '<p>Joe likes <ul><li>pizza</li>, <li>burgers</li>, and <li>fries</li></ul></p>'
m = re.findall('(<li>.+?</li>)',source)
print m
p >
Salut Hugo. Les balises
sont nécessaires car je suppose que cette phrase fait partie d'une page beaucoup plus grande avec de nombreux
n'est qu'un exemple de balise qui illustrerait comment je pourrais isoler la phrase spécifique dont j'essaye d'extraire des informations.
Je cherche un moyen de faire cela sans le "findall", je voudrais obtenir tout le texte en une seule correspondance en utilisant findone.
Essayez cette expression régulière avec re.findall ()
Pour obtenir du texte: , Pour obtenir des balises:
>>> import re
>>> s = "<p>Joe likes <ul><li>pizza</li>, <li>burgers</li>, and <li>fries</li></ul></p>"
>>> text=re.findall("<li>([^<]*)</li>", s)
>>> tag=re.findall("<li>[^<]*</li>", s)
>>> text
['pizza', 'burgers', 'fries']
>>> tag
['<li>pizza</li>', '<li>burgers</li>', '<li>fries</li>']
>>>
Je suggérerais d'utiliser un analyseur HTML.