[Python-de] Backslash in regular expressions

Peter Otten __peter__ at web.de
Mit Jun 8 21:24:43 CEST 2005


Am Mittwoch, 8. Juni 2005 17:00 schrieb Bernd Viehmann:

>  ich habe zwar schon mal was von einem raw-string gehört, um das Problem
> mit Backslashes bei Regular Expressions zu umgehen aber : Wie kann man
> einen RawString an eine Leszte anhängen, um die dopplten Bachslashes zu
> vermeiden ?

Da Dein regulärer Ausdruck keine Backslashes enthält, sollten die auch keine 
Probleme bereiten :-)

> Ich will folgendes machen :
>
>         regex = re.compile("HOSTNAME")
>         for i in range( len( self.hostlist ) ):
>             self.baselist.append(  regex.sub( self.hostlist[i],
> self.base ) )

Dafür benötigst Du keine regex:

for host in self.hostlist:
    self.baselist.append(self.base.replace("HOSTNAME", host))

> In der Liste ( das Skript läuft auf einem Windows System ) finde ich
> aber immer verdoppelte Backslashes vor.
>
> Hat jemand vielleicht einen kleinen Tipp für mich ?

Ich vermute, dass Du auch nach der vorgeschlagenen Änderung noch doppelte 
Backslashes sehen wirst. Die wären dann ein Artefakt, das bei der Umwandlung 
von Listen in Strings entsteht:

>>> print data
['yadda\\yadda']

Die doppelten Backslashes sind dabei genauso wenig Bestandteil des Strings wie 
die einschließenden Anführungszeichen. Sie verschwinden, wenn Du die 
Listeneinträge einzeln ausgibst:

>>> print data[0]
yadda\yadda

Listeneinträge werden aber für die Ausgabe mit repr() konvertiert, da man 
sonst die einzelnen Strings nicht mehr voneinander unterscheiden könnte.

>>> print repr(data[0])
'yadda\\yadda'

Rawstrings sind dagegen eine Erleichterung bei der Eingabe eines 
Stringliterals im Sourcecode:

>>> a = "x\\y"
>>> b = r"x\y"
>>> a == b
True
>>> a, b
('x\\y', 'x\\y')

Peter