2011-09-27 6 views
1

Je tente d'écrire une regex en Python pour extraire une partie d'un paragraphe.Regex pour extraire le paragraphe

Dans le paragraphe ci-dessous, la partie que je souhaite extraire est en gras.

Cette proposition fonds de sauvetage stimuler, injecter des liquidités dans les banques et réduire la dette grecque dit rapports.

Ma regex et de sortie comme suit,

>>> text = 'Proposal will boost bailout fund, inject cash into banks and cut Greek debt says reports.' 
>>> pattern = re.compile(r'(boost bailout)+?([\s\S]*?)(debt)+?') 
>>> print re.findall(pattern, text) 

[('boost bailout', ' fund, inject cash into banks and cut Greek ', 'debt')] 

Bien qu'il n'extrait la bonne section, est-il juste que l'extraction est séparé en 3 parties dans un tuple, et pas seulement une seule ligne telle que le dessous?

[('boost bailout fund, inject cash into banks and cut Greek debt')] 

Répondre

1

De la documentation:

Si un ou plusieurs groupes sont présents dans le modèle, le retour une liste de groupes; ce sera une liste de tuples si le motif a plus d'un groupe. Les résultats vides sont inclus dans le résultat sauf s'ils touchent le début d'un autre match.

- http://docs.python.org/library/re.html

Si vous voulez un match, faire:

#!/usr/bin/env python 
import re 
text = 'Proposal will boost bailout fund, inject cash into banks and cut Greek debt says reports.' 
pattern = re.compile(r'boost bailout[\s\S]*?debt') 
print re.findall(pattern, text) 
+0

Merci encore! Beaucoup à apprendre, beaucoup à apprendre. :) – Ted

+0

De rien, encore une fois, Ted! :) –

1

utilisation

re.search(reg, text).group(0) 

ou (votre cas):

pattern.search(text).group(0) 
0

Votre modèle est incorrect:

(boost bailout)+ signifie: la chaîne 'plan de sauvetage de boost' répété plusieurs fois,
ce qui n'est certainement pas ce que l'on veut. Si vous mettez plusieurs paires de parens dans le motif, vous obtiendrez plusieurs groupes de capture. Le modèle correct, si vous voulez seulement pour extraire tout le texte entre « plan de sauvetage de boost » et la chaîne LAST 'debt' est:

pattern = r'boost bailout.+debt' 

et l'expression rationnelle est

reg = re.compile(r'boost bailout.+debt',re.DOTALL) 

re.DOTALL est un drapeau qui fait correspondre le symbole point à chaque caractère, composé des retours à la ligne: il remplace [\s\S].

Mais si vous voulez extraire entre « boost plan de sauvetage » et première apparition de la « dette », il doit être

pattern = r'boost bailout.+?debt' 

Aussi, utilisez reg.search(text).group() au lieu de reg.findall(text) qui produit une liste d'un élément.

Notez que motif défini par pattern = r'boost bailout.+?debt' est un objet de chaîne, et que
reg défini par reg = re.compile(pattern) est un objet RegexObject.

Ce qui mérite le nom regex est le RegexObject, ce qui mérite le nom modèle est la chaîne.

0

Vous êtes renvoyé un tuple car, comme vous pouvez le lire dans le Python documentation for the re module, les parenthèses créent des groupes de capture, qui peuvent ensuite être récupérés séparément. Pour éviter cela, vous devez utiliser un groupe non-capturant: (?: ...)