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

Résolu/Fermé
Lena-tkd - 28 janv. 2021 à 12:41
 Utilisateur anonyme - 29 janv. 2021 à 17:06
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

Phil_1857 Messages postés 1872 Date d'inscription lundi 23 mars 2020 Statut Membre Dernière intervention 28 février 2024 168
28 janv. 2021 à 13:12
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
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
Utilisateur anonyme
28 janv. 2021 à 15:49
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
yg_be Messages postés 23313 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 8 novembre 2024 Ambassadeur 1 552
28 janv. 2021 à 16:10
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
Phil_1857 Messages postés 1872 Date d'inscription lundi 23 mars 2020 Statut Membre Dernière intervention 28 février 2024 168
28 janv. 2021 à 16:53
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
yg_be Messages postés 23313 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 8 novembre 2024 1 552
28 janv. 2021 à 17:18
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

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Phil_1857 Messages postés 1872 Date d'inscription lundi 23 mars 2020 Statut Membre Dernière intervention 28 février 2024 168
Modifié le 28 janv. 2021 à 17:26
Bah, on pense à ça car il faut prendre exactement phrase, mais pas phrases,

ni paraphrase ...
0
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
Utilisateur anonyme
28 janv. 2021 à 18:23
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
Phil_1857 Messages postés 1872 Date d'inscription lundi 23 mars 2020 Statut Membre Dernière intervention 28 février 2024 168
29 janv. 2021 à 12:04
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
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
Lena_tkd > Lena_tkd
29 janv. 2021 à 12:19
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
yg_be Messages postés 23313 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 8 novembre 2024 1 552
29 janv. 2021 à 12:19
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
Lena_tkd > yg_be Messages postés 23313 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 8 novembre 2024
29 janv. 2021 à 12:26
C'est parfait!!

Merci beaucoup!!
0
yg_be Messages postés 23313 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 8 novembre 2024 1 552 > Lena_tkd
29 janv. 2021 à 13:31
cherche='phrase'
pattern ='\\b'+cherche+'\\b'
0
Phil_1857 Messages postés 1872 Date d'inscription lundi 23 mars 2020 Statut Membre Dernière intervention 28 février 2024 168
29 janv. 2021 à 12:51
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