0
votes

Faire correspondre le texte entre parenthèses plusieurs fois

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>
    


    1 commentaires

    Je suggérerais d'utiliser un analyseur HTML.


    4 Réponses :


    4
    votes

    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>
    


    1 commentaires

    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)?



    2
    votes

    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>']
    


    0 commentaires

    1
    votes

    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 >


    2 commentaires

    Salut Hugo. Les balises

    sont nécessaires car je suppose que cette phrase fait partie d'une page beaucoup plus grande avec de nombreux

  • . La balise

    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.



  • 0
    votes

    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>']
    >>> 
    


    0 commentaires