Python - savoir si un mot est dans un intervalle avec séparateurs particuliers

Résolu
Lena-tkd -  
 Utilisateur anonyme -
Bonjour,

Je débute en Python et j'aimerais simplement savoir si un mot spécifique exact est dans une portion de texte, que j'ai choisi de délimiter par '\n' (mais j'aurais très bien pu dire 'aaa' ou autre); la finalité étant de compter le nombre de portions de texte dans lesquelles se trouve le mot.
Exemple:
#je recherche le mot "phrase" en tenant compte de la casse
montexte: 'Première phrase\nDeuxième phrases\nToisième paraphrase\nQuatrième phrase phrase phrase

Dans cet exemple je devrais obtenir 2, les portions étant ici séparées par '\n' et le mot 'phrase' se trouve dans la première et la dernière.

Auriez-vous une piste à me proposer?

Merci!

8 réponses

  1. Phil_1857 Messages postés 1883 Date d'inscription   Statut Membre Dernière intervention   169
     
    Bonjour,

    Pas très clair

    Première phrase\nDeuxième phrases\nToisième paraphrase\nQuatrième phrase phrase phrase

    Il y a 4 fois le mot phrase, c'est quoi le critère pour découper ?
    0
    1. Lena-tkd
       
      Bonjour,

      Et merci pour votre réponse. Comme indiqué dans ma demande, le délimiteur est ici '\n' mais j'aurais pu utiliser tout autre symbole ou chaîne de caractère. Et la question est de savoir dans combien de ces intervalles le mot 'phrase' apparaît (et non connaître l'occurrence totale).

      Merci encore
      0
  2. Utilisateur anonyme
     
    Bonjour

    En un mot => Regex

    Y’a plein de tuto en français sur le net sur les regex en général.

    A priori pour leurs implémentations en Python, c’est plutôt en anglais.

    Pour trouver la bonne syntaxe avant de l’implémenter dans ton programme, tu peux te servir de regex101.com
    Ce site permet de choisir le moteur de regex python 2.7

    Un exemple
    https://regex101.com/r/WTnpO1/1

    0
  3. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   Ambassadeur 1 588
     
    bonjour,
    je commencerais en utilisant split, qui va te créer une liste de portions.
    montexte= 'Première phrase\nDeuxième phrases\nToisième paraphrase\nQuatrième phrase phrase phrase'
    portions=montexte.split('\n')
    print(portions)
    0
  4. Phil_1857 Messages postés 1883 Date d'inscription   Statut Membre Dernière intervention   169
     
    C'est ça:

    Tu découpe ta chaine en une liste avec split et ensuite, tu parcours
    la liste avec une boucle, et pour chaque élément, tu utilise les expressions régulières pour extraire phrase mais pas phrases,
    ni paraphrase, bref, tout ce qui n'est pas purement
    phrase et tu comptes
    0
    1. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588
       
      n'est-il pas préférable d'utiliser la méthode split pour découper chaque portion en mots, et, ensuite, de chercher dans quelles portions se trouvent le mot
      phrase
      ?
      les expressions régulières ne me semblent pas utiles dans ce cas-ci.
      0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. Phil_1857 Messages postés 1883 Date d'inscription   Statut Membre Dernière intervention   169
     
    Bah, on pense à ça car il faut prendre exactement phrase, mais pas phrases,

    ni paraphrase ...
    0
  7. Utilisateur anonyme
     
    Bon faut admettre que mes tests sur regex101 avec le moteur python 2.7 sont décevants.....

    Ici sur regexstorm, avec le moteur .Net, cette regex
    (?<=\\n.*?)\bphrase\b(?=.*?\\n)
    donne directement le nombre d'occurrences
    (lien à copier coller, car CCM ne l'interprète pas comme il faut)
    http://regexstorm.net/tester?p=%28%3f%3c%3d%5c%5cn.*%3f%29%5cbphrase%5cb%28%3f%3d.*%3f%5c%5cn%29&i=Premi%c3%a8re+phrase%5cnDeuxi%c3%a8me+phrases+phrase%5cnToisi%c3%a8me+%2cphrase%2c+paraphrase%5cnQuatri%c3%a8me+phrase.+phrases+%3aphrase%3b+%5cn+phrase


    Mais, sur regex101, en python 2.7, elle plante, j'ai trouvé un autre site, pyRegex.com où elle plante aussi.
    J'ai essayé sur un site de python en ligne, ça plante aussi mais au moins y'a un message d'erreur...

    0
    1. Utilisateur anonyme
       
      Apparement Python n'accepte pas les "lookahead assertion" et "lookbehind assertion" de longueur variable....
      Si je sors la longueur variable des ces assertions, ça ne reconnait plus
      \nQuatrième phrase. phrases :phrase; \n
      comme 2 occurrences....
      https://regex101.com/r/WTnpO1/3

      Du coup, je me range à l'avis de Phil, un split puis une regex "toute simple" qui cherche dans chaque morceau découpé le mot pile poil.

      https://regex101.com/r/WTnpO1/4
      0
  8. Phil_1857 Messages postés 1883 Date d'inscription   Statut Membre Dernière intervention   169
     
    Bonjour,

    Oui, on peut utiliser la notion de boundary (\b)
    pour délimiter phrase :

    print('\nExact match')
    montexte= 'Première phrase\nDeuxième phrases\nToisième paraphrase\nQuatrième phrase phrase phrase'
    portions=montexte.split('\n')
    print(portions)
    
    pattern ='\\bphrase\\b'
    print(re.findall(pattern, portions[1]))
    
    0
    1. Lena_tkd
       
      Bonjour,

      Et merci à tous pour vos réponses. En me basant dessus, je suis parvenue au code suivant, qui semble faire le job, puisque j'obtiens 2 en résultat:

      montexte='Première phrase\nDeuxième phrases\nToisième paraphrase\nQuatrième phrase phrase phras\n'
      portions=montexte.split('\n')
      co=0
      for portion in portions:
          if re.search(r'\bphrase\b',portion):
              co+=1
      print(co)


      Merci!
      0
    2. Lena_tkd > Lena_tkd
       
      J'aimerais maintenant simplement savoir comment faire pour ne pas nommer le mot 'phrase' dans le 're.search' mais plutôt utiliser la variable 'mot' qui contiendrait le mot que l'on souhaiterait rechercher, et l'intégrer dans le code, sauriez-vous comment faire?

      Merci!
      0
    3. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588
       
      l'utilisation de regex me semble un détour inutile:
      montexte= 'Première phrase\nDeuxième phrases\nToisième paraphrase\nQuatrième phrase phrase phrase'
      cherche='phrase'
      nmots=0
      for portion in montexte.split('\n'):
          for mot in portion.split(' '):
              if mot==cherche:
                  nmots = nmots + 1
                  break
      print (nmots)
      0
    4. Lena_tkd > yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention  
       
      C'est parfait!!

      Merci beaucoup!!
      0
    5. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588 > Lena_tkd
       
      cherche='phrase'
      pattern ='\\b'+cherche+'\\b'
      0
  9. Phil_1857 Messages postés 1883 Date d'inscription   Statut Membre Dernière intervention   169
     
    l'utilisation de regex me semble un détour inutile:

    Oui mais de mon point de vue c'est direct et élégant, je trouve, pas besoin de créer la mécanique soi-même ...

    Bon .....
    0