2011-09-21 7 views
0

Je le code suivant (simplifié) - ce qui est l'essence de ce que je voudrais faireModifier le contenu du groupe en python expression régulière MatchObject

def replace_todo(m): 
    m[2] = '*' if value else ' ' 
    return m.group() 

Je veux modifier un groupe spécifique dans l'objet du match, puis restituez l'intégralité de la correspondance, y compris la partie modifiée.

La fonction replace_todo est appelée à chaque match en utilisant

myCompiledRegex.sub(replace_todo, text) 

Le texte qui est utilisé comme entrée est

[ ] mah lalalalalaa 
[*] mah lalalalalaa 

résultat attendu

[*] mah lalalalalaa 
[*] mah lalalalalaa 

Le regex ressemble à ceci

^(\[(|\*)]) ([a-z][a-z][a-z]) (.*)$ 

Mais il semble que je ne suis pas autorisé à modifier l'objet match

Quand je tente d'exécuter le code ci-dessus je reçois le TypeError suivant

_sre.SRE_Match' object does not support item assignment 

Merci à l'avance :)

EDIT:

En utilisant la solution spicavigo, lors de la conversion de la liste en une chaîne (str (groupes)) voici à quoi cela ressemble

[u’[ ]’, '*’, u’jsp’, u’do something’] 

c'est la façon dont il devrait ressembler

[*] jsp do something 
+0

S'il vous plaît pourriez-vous inclure dans votre question: (1) regex réel; (2) un ou deux exemples d'entrées réelles avec les résultats attendus. – NPE

+0

Fait :) Mais ce n'est pas vraiment si pertinent, tout ce dont j'ai besoin est un moyen d'éditer un seul groupe de matchs, puis de sortir le match entier :) – Moulde

Répondre

2

Je suis novice en matière de regex mais ne pourrais pas vous prendre m.groups() d'abord, le changement que vous souhaitez, puis retourner la variable ?

Dis:

x=list(m.groups()) #NOTE: groups and not group 
x[2] = '*' if value else ' ' 
return x 

EDIT

Peut-être que maintenant je ce que vous essayez d'atteindre. Comme il est mentionné dans le commentaire ci-dessous, vous pouvez changer votre regex à

'^(\[)(|\*)(]) ([a-z][a-z][a-z]) (.*)$' 

Ceci est essentiellement d'aider à se joindre à la liste des m.groups()

+0

ohh bucka, qui a introduit un autre problème – Moulde

+0

Cela ne marchera pas parce que les groupes ne sont pas ordonnés exactement comment il devrait être rendu, fondamentalement ce dont j'ai besoin est un moyen de changer les valeurs dans l'objet de correspondance, de sorte que je puisse appeler la fonction group() et lui faire sortir l'entrée modifiée. Si je viens de joindre les éléments de la liste ensemble, il finira avec ce "[] * xxxremember stuff" mais j'ai besoin de ce "[*] xxx se souvenir des choses" – Moulde

+0

Essayez de changer votre regex à cette '^ (\ [) (| \ *) (]) ([az] [az] [az]) (.*) $ ' – spicavigo