[Python-de] re.sub(...,dictionary[\1])

Gerhard Haering gh at ghaering.de
Thu Mar 27 08:23:39 EST 2003


Falk Friedrich wrote:
> Hallihallo,
> 
> Hoffentlich kann mir hier einen nen Tip geben. :-)
> 
> Beispielprogramm:
> #!/usr/bin/env python
> import re
> kat = {'$1': 'Link1', '$2': 'LinkB', '$3': 'LastLink'}
> text='a $1 b  $2 c  $3.'
> text = re.sub(r'(\$[0-9]+)',r'<a href=".?d=\1>kat[\1]</a>"',text)
> print text
> 
> Ausgabe:
> a <a href=".?d=$1>kat[$1]</a>" b  <a href=".?d=$2>kat[$2]</a>" c  <a href=".?d=$3>kat[$3]</a>".
> 
> Gewollte Ausgabe:
> a <a href=".?d=$1>Link1</a>" b  <a href=".?d=$2>LinkB</a>" c  <a href=".?d=$3>LastLink</a>".

#v+
#!/usr/bin/env python
import re
kat = {'$1': 'Link1', '$2': 'LinkB', '$3': 'LastLink'}
text='a $1 b  $2 c  $3.'

def replaced_link(s):
     key = s.group(0)
     return '<a href="%s">kat%s</a>' % (kat[key], key[1:])

text = re.sub(r'(\$[0-9]+)', replaced_link, text)

print text
#v-

Wenn dir das zu gut lesbar ist, kannst du die Funktion durch ein Lambda 
ersetzen ;-)

> Ich will also irgendwie, daß im Ersetzen-String 'kat[\1]' nicht
> einfach ausgegeben, sondern weiter ersetzt wird.
> Beispiel: $1  ::  kat[\1] -> kat[1] -> Link1

Du kommst wahrscheinlich von einer anderen, RE-lastigen Sprache (Perl?). 
Ich würde dir empfehlen, im Zweifelsfall die Doku zur gesuchten Funktion 
(hier re.sub) zu lesen statt anzunehmen, dass es irgendwie genauso gehen 
wird ;-) Dein Anwendungsfall ist nämlich unter 
http://www.python.org/doc/current/lib/node99.html sogar mit einem 
Beispiel beschrieben.

Die Syntax der Rückwärtssubstituion von Treffern, die du angegeben hast, 
gibt es in Python-REs so nicht.

-- Gerhard





More information about the Python-de mailing list