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

Résolu
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. 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. 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. 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
    1. Contributeur
      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
      1. 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. Contributeur
          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
      2. Bah, on pense à ça car il faut prendre exactement phrase, mais pas phrases,

        ni paraphrase ...
        0
        1. 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. 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
        2. 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. 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_tkdJ'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. Contributeur
            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. @yg_beC'est parfait!!

            Merci beaucoup!!
            0
          5. Contributeur
            @Lena_tkd
            cherche='phrase'
            pattern ='\\b'+cherche+'\\b'
            0
        3. 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