it-swarm.com.de

Wie verwende ich python regex, um mithilfe der erfassten Gruppe zu ersetzen?

Angenommen, ich möchte the blue dog and blue cat wore blue hats In the gray dog and gray cat wore blue hats Ändern.

Mit sed könnte ich dies wie folgt erreichen:

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

Wie kann ich in Python einen ähnlichen Ersatz durchführen? Ich habe es versucht:

>>> 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'
48
Eric Wilson

Sie müssen Ihrem Backslash entkommen:

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

alternativ können Sie eine Rohzeichenfolge verwenden, wie Sie es bereits für den regulären Ausdruck getan haben:

p.sub(r'gray \1', s)
60
mac

Als ich nach einer ähnlichen Antwort suchte; Da ich jedoch benannte Gruppen innerhalb der Ersetzung verwenden wollte, dachte ich, ich würde den Code für andere hinzufügen:

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

Versuche dies:

p.sub('gray \g<1>',s)
6
CAB

Off topic, Für nummerierte Erfassungsgruppen:

#/usr/bin/env python
import re

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

Word: asdf, digit: 1

Python verwendet einen wörtlichen Backslash und einen auf einem Index basierenden Index, um nummerierte Ersetzungen von Erfassungsgruppen durchzuführen, wie in diesem Beispiel gezeigt. So \1, eingegeben als '\\1', verweist auf die erste Erfassungsgruppe (\d), und \2 die zweite erfasste Gruppe.

5
ThorSummoner