Vous êtes ici : Accueil / Forums & ML / Forums Python / Forum général Python / nouveau - problème avec findall

nouveau - problème avec findall

Remonter à Forum général Python
  • nouveau - problème avec findall

    Envoyé par biterrenc le 27 Avril 2010 à 19:52
    Bonsoir à tous,

    Je fais un programme qui récupére tous les mots d'un texte.
    je le fais avec un split() ou similaire un (re.findall('[\S]+', texte) avec des essais comme ça (re.findall('[\S\.]+') Mais cela ne me donne pas ce que je veux:
    dans la phrase << le cheval est dans le pré.Avec cette herbe , il va se régaler !>>
    Comme il n'y a pas d'espace entre << pré.Avec>> il me donne comme mot tout le bloc.

    Pour remédier à cela, je fais un traitement qui rajoute un espace au point de fin de phrase. C'est un peu lourd donc ..

    Question:
    par re.findall() ne serait-il pas possible pour récupérer << pré.>> <>. J'essaye depuis un long moment avec Kodos mais je n'y arrive pas.
    Quelqu'un aurait-il une idée ?

    Merci par avance,
    Bruno
    • Re: nouveau - problème avec findall

      Envoyé par bibile le 27 Avril 2010 à 20:04
      perso, je suis nul en expression reguliere, donc, je ferais sans doute comme ca.


      >>> s=u'le cheval est dans le pré.Avec cette herbe , il va se régaler !'
      >>> ponctuation=',.;:!?'
      >>> for e in ponctuation:
      ... s=s.replace(e, ' ')
      ...
      >>> s
      u'le cheval est dans le pr\xe9 Avec cette herbe il va se r\xe9galer '
      >>> s.split()
      [u'le', u'cheval', u'est', u'dans', u'le', u'pr\xe9', u'Avec', u'cette', u'herbe', u'il', u'va', u'se', u'r\xe9galer']

      la solution en regex m'interesse aussi !
    • Re: nouveau - problème avec findall

      Envoyé par biterrenc le 28 Avril 2010 à 08:20
      merci bibile pour ta réponse

      Mon problème (stupide, je l'avoue !) c'est que je veux récupérer en plus le " . " au mot auquel il est collé :
      C'est-à-dire avoir " pré." et "Avec".
      Normalement le code du début du traitement vérifie chaque point de fin de phrase pour voir s'il y a un espace si non il l'insére. Mais cela oblige à programmer plusieurs lignes ... si un findall peut le faire en un coup !

      En tout cas merci ton idée "for e in ponctuation" et "s.replace (e,'')", c'est une façon de faire qui ne m'était pas venue à l'esprit. Elle peut me servir dans d'autres endroits du correcteur ortho que je fais.
      je continue sur le findall, on ne sait jamais.
      si quelqu'un a une idée... qu'il n'hésite pas !

      Merci
      Biterrenc
    • Re: nouveau - problème avec findall

      Envoyé par bibile le 28 Avril 2010 à 09:17

      >>> ponctuation1=',.'
      >>> ponctuation2=';:!?'
      >>> for e in ponctuation1:
      ... s=s.replace(e, e + ' ')
      >>> for e in ponctuation2:
      ... s=s.replace(e, ' ' + e + ' ')

      juste une idee.
      mais je sais pas le faire en une ligne. et c'est faux parce qu'il ne verifie pas si il y a un espace devant les elements de ponctuation1
      j'espere qu'une star des expressions regulieres va passer par la !
    • Re: nouveau - problème avec findall

      Envoyé par jacko le 28 Avril 2010 à 12:48
      Et comme cela :


      >> re.findall('[^ .]+[.]*',texte)
      ['le', 'cheval', 'est', 'dans', 'le', 'pr\x82.', 'Avec', 'cette', 'herbe', ',',
      'il', 'va', 'se', 'r\x82galer', '!']


      ?
    • Re: nouveau - problème avec findall

      Envoyé par biterrenc le 28 Avril 2010 à 15:38
      Merci bibile pour tes essais
      Merci Jacko, tu m'as donné exactement ce que je voulais. Cela m'enlève 19 lignes de programmation, avec chargement de liste et de dic !
      Je programme encore << à la louche >> avec python malgré la lecture de " Python en concentré " et de nombreux tutoriels. Ton findall est impec!
      Pour ma richesse personnelle :
      [^ .] veut dire que tu prends tous les caractères
      sauf espace et point. Dès qu'il trouve un point, c'est [.] qui prend le relais et qui le rajoute au résultat de [^ .] ?

      En tout cas, merci à tous deux, je vais pouvoir continuer mon correcteur orthog. avec encore plus de plaisir.
      Bruno
      ps : je ne sais pas comment on marque le sujet comme résolu
    • Re: nouveau - problème avec findall

      Envoyé par jacko le 28 Avril 2010 à 17:09
      Ravi d'avoir répondu à votre besoin.

      Plus précisémment, on recherche tous les blocs formés de :
      - une suite, d'au moins 1 caractère, de caractères différents de blanc ou point (+ signifie 1 ou N occurences).
      - suivie d'un nombre quelconque de points, y compris zéro (* signifie 0 ou 1 ou N occurences).
      Sachant qu'on prend à chaque fois le plus de caractères possibles respectant ces règles.

      Pour les expressions régulières, avec cette syntaxe particulière, il faut savoir que ce n'est pas une invention Python : elles sont bien plus anciennes et ont été introduites par Unix. Le module re ne fait que les implémenter dans Python. Tout cela pour dire qu'on peut trouver des doc. à leur sujet ailleurs que dans le monde Python. Il y a aussi un howto sur elles dans la doc standard Python :
      http://docs.python.org/howto/regex.html

      Note :
      dans le terme :
      [.]*
      les crochets sont un peu inutiles puisqu'il n'y a qu'un seul caractère dedans (le point). On pourrait aussi bien écrire simplement :
      .*
      mais il faut alors un \ devant le point, pour qu'il soit considéré litéralement (sinon, le point hors crochet représente (match) un caractère quelconque).
      Bref, la commande :

      re.findall('[^ .]+[.]*',texte)

      peut aussi être écrite :

      re.findall('[^ .]+\.*',texte)



Rendu par Ploneboard