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']
3 Réponses :
Vous devez modifier votre expression régulière pour utiliser une anticipation:
['boy', 'he']
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)
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)
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.
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)]
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.
changez simplement le groupe capuring en interne comme ceci -> (?: (\ S + \ s +) \ bis \ b)
regex, \ S + (? = \ s + est \ b)