2017-09-03 2 views
-1

J'ai un modèle comme ci-dessous:Trouver tous les matchs d'un motif et les remplacer dans un texte

measurement = re.compile("(\d+(?:\.\d*)?)\s*x\s*(\d+(?:\.\d*)?)\s*(cm|mm|millimeter|centimeter|millimeters|centimeters)") 

On peut voir à plusieurs reprises dans une phrase et dans un document. Je veux trouver tous les matches et le remplacer par "MESURE", aussi je veux ajouter sa valeur dans une liste.

**Input_Text**: measuring 9 x 5 mm and previously measuring 8 x 6 mm 

**Output**: measuring MEASUREMENT and previously measuring MEASUREMENT 

**List**: 9 x 5 mm, 8 x 6 mm 

Jusqu'à présent, mon code est ci-dessous, mais il apporte seulement le premier match:

result = re.search(measurement, Input_Text) 
        if result: 
         Input_Text = Input_Text.replace(result, "MEASUREMENT") 
+1

utilisation 're.finditer (pattern, string)';). –

+1

Vous ne pouvez pas remplacer 'result' dans le texte, de toute façon; c'est un [objet de correspondance] (https://docs.python.org/3/library/re.html#match-objects). –

+0

Alors, pourquoi existe-t-il une variable 'findings_section' séparée? Est-ce la même chose que 'Input_Text'? –

Répondre

1

Vous pouvez utiliser re.sub() pour le remplacement et re.findall() pour obtenir toutes les chaînes correspondantes.

measurement = re.compile("(\d+(?:\.\d*)?)\s*x\s*(\d+(?:\.\d*)?)\s*(cm|mm|millimeter|centimeter|millimeters|centimeters)") 

text = "measuring 9 x 5 mm and previously measuring 8 x 6 mm" 

values = re.findall(pattern=measurement, string=text) 

sub_text = re.sub(pattern=measurement, string=text, repl='MEASUREMENT') 

>>> sub_text 
'measuring MEASUREMENT and previously measuring MEASUREMENT' 

>>> values 
[('9', '5', 'mm'), ('8', '6', 'mm')] 
1

Si vous ne voulez pas analyser votre chaîne deux fois, vous pouvez utiliser re.sub avec une fonction en tant que paramètre de remplacement. Avec cette fonction, vous pouvez facilement remplir une liste de chaînes correspondantes.

pat = re.compile(r'\d+(?:\.\d*)?\s*x\s*\d+(?:\.\d*)?\s*(?:cm|mm|millimeters?|centimeters?)') 

s = r'measuring 9 x 5 mm and previously measuring 8 x 6 mm' 

l = [] 

def repl(m): 
    l.append(m.group(0)) 
    return 'MEASUREMENT' 

s = pat.sub(repl, s)