it-swarm.com.de

Python wird durch übereinstimmenden Inhalt ersetzt

Beim Versuch, mit regulären Ausdrücken in Python zurechtzukommen, versuche ich, etwas HTML auszugeben, das in einem Teil einer URL hervorgehoben ist. Meine Eingabe ist

images/:id/size

meine Ausgabe sollte sein

images/<span>:id</span>/size

Wenn ich das in Javascript mache

method = 'images/:id/size';
method = method.replace(/\:([a-z]+)/, '<span>$1</span>')
alert(method)

Ich bekomme das gewünschte Ergebnis, aber wenn ich das in Python mache

>>> method = 'images/:id/huge'
>>> re.sub('\:([a-z]+)', '<span>$1</span>', method)
'images/<span>$1</span>/huge'

Ich weiß nicht, wie kann ich Python dazu bringen, das korrekte Ergebnis anstelle von $1 zurückzugeben? Ist re.sub sogar die richtige Funktion, um dies zu tun?

40
Smudge

Verwenden Sie einfach \1 anstelle von $1:

In [1]: import re

In [2]: method = 'images/:id/huge'

In [3]: re.sub(r'(:[a-z]+)', r'<span>\1</span>', method)
Out[3]: 'images/<span>:id</span>/huge'

Beachten Sie auch die Verwendung von raw strings (r'...') für reguläre Ausdrücke. Es ist nicht zwingend erforderlich, entfernt jedoch die Notwendigkeit, Backslashes zu umgehen, was den Code etwas lesbarer macht.

70
NPE

Verwenden Sie \1 anstelle von $1.

\ number Entspricht dem Inhalt der Gruppe mit derselben Nummer.

http://docs.python.org/library/re.html#regular-expression-syntax

12
user647772

Als Ersatzteil verwendet Python \1 wie Sed und vi, nicht $1 wie Perl, Java und Javascript (ua). Da \1 in regulären Zeichenfolgen als Zeichen U + 0001 interpoliert, müssen Sie außerdem eine unformatierte Zeichenfolge verwenden oder\escape machen.

Python 3.2 (r32:88445, Jul 27 2011, 13:41:33) 
[GCC 4.0.1 (Apple Inc. build 5465)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> method = 'images/:id/huge'
>>> import re
>>> re.sub(':([a-z]+)', r'<span>\1</span>', method)
'images/<span>id</span>/huge'
>>> 
4
tchrist

Ein Rückverweis auf den gesamten Übereinstimmungswert ist \g<0>, siehe re.sub Dokumentation :

Der Rückverweis \g<0> ersetzt den gesamten durch die RE übereinstimmenden Teilstring.

Siehe die Python-Demo :

import re
method = 'images/:id/huge'
print(re.sub(r':[a-z]+', r'<span>\g<0></span>', method))
# => images/<span>:id</span>/huge
0