2011-07-15 16 views
32

Załóżmy, że chcę zmienić the blue dog and blue cat wore blue hats na the gray dog and gray cat wore blue hats.Jak używać python regex do zastąpienia przy użyciu przechwyconej grupy?

Z sed mogę tego dokonać w następujący sposób:

$ echo 'the blue dog and blue cat wore blue hats' | sed 's/blue \(dog\|cat\)/gray \1/g' 

Jak mogę zrobić podobną wymianę w Pythonie? Próbowałem:

>>> import re 
>>> s = "the blue dog and blue cat wore blue hats" 
>>> p = re.compile(r"blue (dog|cat)") 
>>> p.sub('gray \1',s) 
'the gray \x01 and gray \x01 wore blue hats' 

Odpowiedz

42

Musisz uciec swoją backslash:

p.sub('gray \\1', s) 

alternatywnie można użyć surowego ciąg jak już zrobił dla regex:

p.sub(r'gray \1', s) 
+0

Druga odpowiedź jest idealna, ponieważ pasuje do składni "sed". –

5

Try This :

p.sub('gray \g<1>',s) 
+3

Dobra alternatywa (+1), ale nadal działa tylko dlatego, że '\ g' nie jest prawidłowym kodem z kodami ucieczkowymi. Bezpiecznym sposobem pisania kodu nadal powinno być: 'p.sub ('grey \\ g <1>', s)' – mac

+0

Przepraszam, miałem na myśli, że to surowy ciąg. Pominąłem też argument zastępczy - byłem na fali! Usuwam komentarz. Zgadzam się w 100% z tym, że nie liczę na zbyt permisywne zachowanie Pythona w odniesieniu do sekwencji ucieczki. –

+2

@mac Zastanów się nad dodaniem komentarza do swojej odpowiedzi. Jest to jedyna rzecz, która działała niezawodnie w notebooku ipython. – bahmait

10

Gdy szukałem podobnej odpowiedzi; ale chcąc pomocą nazwanych grup w ramach zamiany, myślałem, że dodać kod dla innych:

p = re.compile(r'blue (?P<animal>dog|cat)') 
p.sub(r'gray \g<animal>',s) 
2

off topic, Dla numerowanymi grup przechwytujących:

#/usr/bin/env python 
import re 

re.sub(
    pattern=r'(\d)(\w+)', 
    repl='word: \\2, digit: \\1', 
    string='1asdf' 
) 

word: asdf, digit: 1

Python używa dosłownego ukośnika odwrotnego oraz indeksu bazowego do wykonywania ponumerowanych zastępczych grup przechwytywania, jak pokazano w tym przykładzie. Tak więc \1, wprowadzony jako '\\1', odnosi się do pierwszej grupy przechwytującej (\d) i \2 do drugiej przechwyconej grupy.

Powiązane problemy