2016-03-24 9 views
2

In Perl ist es mir möglich, eine Substitution zu machen und eine Gruppenübereinstimmung gleichzeitig zu erfassen. z.B.Get Group Match in re in Python

my $string = "abcdef123"; 
$string =~ s/(\d+)//; 
my $groupMatched = $1; # $groupMatched is 123 

In Python kann ich die Substitution mit re Funktion wie folgt tun. Ich finde jedoch keine Möglichkeit, die \ d + -Gruppenübereinstimmung zu erfassen, ohne eine andere Funktion re.match aufzurufen und eine zusätzliche Operation auszuführen.

Weiß jemand, wie ich den "\ d +" übereinstimmenden Wert als eine separate Variable von der gleichen re-Operation erfassen kann? Ich habe den folgenden Befehl ausprobiert und es funktioniert nicht.

print r'\1' 
+1

Ich bin mir nicht sicher, ob dies (zumindest gleichzeitig) möglich ist, weil das Rückgabeobjekt von 're' eine Zeichenkette ist. Wenn Sie so etwas haben, 'rx_obj = re.search ('123 $', another_string)', erhalten Sie ein RE-Objekt, das von 'rx_obj.group()' erfasst werden kann. – maxie

+0

Ich nehme an, Sie könnten Recht haben, dass es nicht möglich ist, beides gleichzeitig zu tun. Die anderen Wege scheinen ein bisschen hackisch oder sind im Grunde zwei getrennte Schritte. – KT8

+1

Beachten Sie, dass Sie in Perl immer überprüfen sollten, ob Ihre Übereinstimmung erfolgreich war, bevor Sie die speziellen nummerierten Variablen verwenden: 'if ($ str = ~ s/(\ d +) //) {$ x = $ 1; } ' – stevieb

Antwort

1

Sie können folgendes tun:

sub_str = re.search("(\d+)", str).group(1) 

finden die "123" Teil.

Sie es dann ersetzen:

str = str.replace(sub_str, "") 

Beachten Sie, dass, wenn Sie mehr als [0-9] Sequenz haben Sie auf alle Spiele findall und iterieren manuell verwenden müssen.

+0

Diese Antwort ist falsch oder zumindest nicht sehr allgemein - Sie können nicht davon ausgehen, dass das Finden von' sub_str' als String dasselbe ist wie das Finden des ursprünglichen Musters als regulärer Ausdruck. Wenn beispielsweise das Muster "r" foo (?! Bar) "' ist, wird es "foobarfoo" 'nur an der Position 6 anpassen, aber die übereinstimmende Zeichenfolge" foo "erscheint an den Positionen 0 und 6. –

4

können Sie betrügen und eine Funktion re.sub passieren:

results = [] 
def capture_and_kill(match): 
    results.append(match) 
    return "" 
string = "abcdef123" 
string = re.sub("(\d+)", capture_and_kill, string) 
results[0].group(1) 
# => '123' 
0

Code unten unter Python getestet 3.6.

test = "abcdef123" 
resp = re.sub(r'\w+[A-Za-z](\d+)',r'\1',test) 
print (resp) 

123 
+0

Dies ist beantwortet die Frage nicht - es kommt einfach vor, dass dieselbe Zeichenfolge wie "\ 1" zurückgegeben wird, da das Ersatzmuster "r" \ 1 "ist. –