2010-06-17 7 views
7
>>> s = 'foo: "apples", bar: "oranges"' 
>>> pattern = 'foo: "(.*)"' 

Ich möchte in die Gruppe so zu ersetzen, in der Lage sein:Wie in einem regulären Ausdruck Gruppe in Python zu ersetzen

>>> re.sub(pattern, 'pears', s, group=1) 
'foo: "pears", bar: "oranges"' 

Gibt es eine schöne Möglichkeit, dies zu tun?

+2

Ihr Muster den gierigen Operator verwendet '*', was bedeutet, es wird die längste Match bekommen es finden kann, was bedeutet, dass in. Ihr Fall wird die Gruppe "Äpfel" sein, Bar: "Orangen". Sie suchen nach '(. *?)' – abyx

Antwort

9

Für mich funktioniert so etwas wie:

rx = re.compile(r'(foo: ")(.*?)(".*)') 
s_new = rx.sub(r'\g<1>pears\g<3>', s) 
print(s_new) 

Hinweis ? in re, so es endet mit dem ersten ", auch " in den Gruppen 1 und 3 bemerkt, weil sie in der Ausgabe sein muss.

Statt \g<1> (oder \g<number>) Sie nur \1 verwenden können, aber nicht vergessen „raw“ Strings zu verwenden, und dass g<1> Form preffered, weil \1 mehrdeutig sein könnte (sucht Beispiele in Python doc).

0
re.sub(r'(?<=foo: ")[^"]+(?=")', 'pears', s) 

Die Regex entspricht einer Folge von Zeichen, dass

  • die Zeichenfolge Folgt foo: ",
  • enthält keine doppelten Anführungszeichen und
  • wird von "

gefolgt (?<=) und (?=) sind lookbehind and lookahead

Diese Regex wird fehlschlagen, wenn der Wert foo ungültige Quotes enthält. Verwenden Sie das folgende man sie zu fangen:

re.sub(r'(?<=foo: ")(\\"|[^"])+(?=")', 'pears', s) 

Beispielcode

>>> s = 'foo: "apples \\\"and\\\" more apples", bar: "oranges"' 
>>> print s 
foo: "apples \"and\" more apples", bar: "oranges" 
>>> print re.sub(r'(?<=foo: ")(\\"|[^"])+(?=")', 'pears', s) 
foo: "pears", bar: "oranges" 
+0

Das gibt '' foo: "Birnen" 'zurück – Iacopo

+0

@lacopo Das war ein Tippfehler - versuchen Sie es mit der aktualisierten Regex. Ersetzte '[^ =]' durch '[^'] '. Seien Sie gewarnt, dass dies fehlschlägt, wenn der Wert von' foo' Fließkommazahlen enthält. – Amarghosh

+0

@lacopo hat die Regex aktualisiert, um auch mit Escapezeichen zu arbeiten. – Amarghosh

Verwandte Themen