1
votes

Pourquoi mon code ne fonctionne pas? pour trouver un mot avant le match

s = 'A boy is playing and he is wearing shirt.'
My regex is ((?:\S+\s+)\bis\b)My output: ['boy is' ,'he is']Expected output: ['boy','he']

2 commentaires

changez simplement le groupe capuring en interne comme ceci -> (?: (\ S + \ s +) \ bis \ b)


regex, \ S + (? = \ s + est \ b)


3 Réponses :


2
votes

Vous devez modifier votre expression régulière pour utiliser une anticipation:

['boy', 'he']

Démo sur regex101

En python

import re

s = 'A boy is playing and he is wearing shirt.'
print(re.findall(r'\S+(?=\s+is\b)', s))

Sortie:

\S+(?=\s+is\b)


1 commentaires

Petite suggestion. Vous pouvez utiliser une chaîne brute pour éviter les doubles échappements, c'est-à-dire re.findall (r '\ S + (? = \ S + is \ b)', s)



3
votes

Vous pouvez réorganiser un peu votre groupe de capture pour garder is mot en dehors du groupe et utiliser re.findall:

>>> s = 'A boy is playing and he is wearing shirt.'
>>> re.findall(r'(\S+)\s+is\b', s)
['boy', 'he']

findall renvoie uniquement le groupe capturé, s'il y en a dans votre regex.

Notez également qu'il n'est pas nécessaire d'utiliser \ b (limite de mot) après espaces correspondants.


0 commentaires

0
votes

Solution

Pour garder la solution la plus proche de ce que vous avez obtenu précédemment, vous pouvez remplacer le 'is' par '' et puis supprimez tout espace blanc à gauche, en utilisant une compréhension de liste sur le résultat re.findall .

['boy', 'he']

Sortie :

import re

s = 'A boy is playing and he is wearing shirt.'
[x.replace('is','').strip() for x in re.findall('\s*([a-zA-Z+]*\s+is)', s)]


4 commentaires

Cela donnera un résultat incorrect si l'entrée est s = 'Un garçon joue et il porte sa chemise.'


@anubhava Merci de l'avoir signalé. '... \ s * is)' remplacé par '... \ s + is)' pour s'en occuper.


ok bien mais pourquoi utiliser .replace et .strip quand cela peut être fait avec juste findall


Convenu. findall seul peut le faire. Mais je voulais montrer si vous commencez par le résultat ['boy is', 'he is'] , comment vous pouvez extraire ['boy', 'he'] avec compréhension de liste. Ce n'est pas une meilleure solution que findall , mais c'est au moins une solution. Le fait est que parfois, on peut ne pas avoir le pétern regex correct et cela pourrait conduire à une situation similaire. Je voulais souligner comment on pouvait penser contourner une telle situation.