2010-08-22 3 views
16

Je dois trouver, traiter et supprimer (un par un) des sous-chaînes qui correspondent à une expression régulière assez longue:match python regex et remplacez

# p is a compiled regex 
# s is a string 
while 1: 
    m = p.match(s) 
    if m is None: 
     break 
    process(m.group(0)) #do something with the matched pattern 
    s = re.sub(m.group(0), '', s) #remove it from string s 

Le code ci-dessus n'est pas bon pour 2 raisons:

  1. Cela ne fonctionne pas si m.group (0) contient des caractères spéciaux regex (comme *, +, etc.).

  2. Il me semble que je duplique le travail: d'abord je recherche la chaîne pour l'expression régulière, et puis je dois aller chercher à nouveau pour l'enlever.

Quelle est une bonne façon de faire cela?

Répondre

19

La fonction re.sub peut prendre une fonction comme un argument pour que vous puissiez combiner les étapes de remplacement et de traitement si vous le souhaitez:

# p is a compiled regex 
# s is a string 
def process_match(m): 
    # Process the match here. 
    return '' 

s = p.sub(process_match, s) 
+0

Merci, a oublié que .. – max

+0

Ah et je compris ce qu'il faut faire si je veux remplacer une chaîne qui peut contenir des symboles regex .. re.escape (s) prend soin de cela. – max

+0

désolé mais quel est p? – CodyBugstein