Seite 1 von 1

Regex suche nach bar in

Verfasst: Samstag 28. Dezember 2013, 15:40
von p90
Hi,

habe ein Problem mit Regex in Python.
Ich habe einen String der Form 'foo"bar"fasel' und möchte gerne den String zwischen den " haben.
Nun dachte ich ganz naive (und http://regexpal.com/ gibt mir recht)

Code: Alles auswählen

import re
a = 'foo"bar"fasel'
re.match('".*"', a)
->None
wäre die Lösung aber leider bekomme ich statt einem Match Object nur ein None zurück.
Also dachte ich: vlt macht das " da irgendwie Probleme und ich muss das escapen:

Code: Alles auswählen

import re
a = 'foo"bar"fasel'
re.match('\".*\"', a)
->None
Geht auch nicht.
Okay, dachte ich mir, teste ich erstmal nur mit einem " um zu sehen ob ich das escapen muss oder nicht:

Code: Alles auswählen

import re
a = 'foo"bar"fasel'
re.match('.*"', a).group(0)
->foo"bar"
Das macht Sinn.

Code: Alles auswählen

import re
a = 'foo"bar"fasel'
re.match('.*\"', a).group(0)
->foo"bar"
Also scheint das Escapen keinen Unterschied zu machen.
Hab auch schon mit Lookahead etc. experimentiert aber bekomme es nicht hin.
Irgendwo ist da ein Fehler, vermutlich weil " ja auch als Sonderzeichen für Strings dient.
Hat jemand einen Tipp wie ich mein Regex verändenr muss, damit ich aus: 'foo"bar"fasel' einfach bar bekomme?

Re: Regex suche nach bar in

Verfasst: Samstag 28. Dezember 2013, 16:08
von pillmuncher
Statt re.match() möchtest du re.search() verwenden. Und dann einfach die Gänsefüßchen abzwicken:

Code: Alles auswählen

>>> import re
>>> a = 'foo"bar"fasel'
>>> re.search('".*"', a).group(0)[1:-1]
'bar'

Re: Regex suche nach bar in

Verfasst: Samstag 28. Dezember 2013, 16:23
von Sirius3
in diesem Fall würde ich keinen regulären Ausdruck verwenden:

Code: Alles auswählen

a='foo"bar"fasel'
a.split('"',2)[1]
oder wenn es doch einer sein soll:

Code: Alles auswählen

re.search('"(.*?)"', a).group(1)

Re: Regex suche nach bar in

Verfasst: Samstag 28. Dezember 2013, 16:26
von /me
pillmuncher hat geschrieben:Und dann einfach die Gänsefüßchen abzwicken:

Code: Alles auswählen

>>> re.search('".*"', a).group(0)[1:-1]
Ich würde sie ja gar nicht erst mitnehmen.

Code: Alles auswählen

re.search('"(.*)"', a).group(1)
Der Ausdruck ist allerdings gierig. Wenn du mehrere Gruppen mit Anführungszeichen im Text hast, dann wird hier der Text vom ersten bis zum letzten Anführungszeichen genommen.

Re: Regex suche nach bar in

Verfasst: Samstag 28. Dezember 2013, 16:47
von p90
Danke!
Der Link zu re.match vs re.search war Gold Wert!
Habs endlich hin bekommen und jetzt macht es natürlich auch Sinn, dass es die ganze Zeit nicht funktionierte!
Vielen Dank!