Regex suche nach bar in

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
p90
User
Beiträge: 198
Registriert: Donnerstag 22. Juli 2010, 17:30

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?
Benutzeravatar
pillmuncher
User
Beiträge: 1532
Registriert: Samstag 21. März 2009, 22:59
Wohnort: Pfaffenwinkel

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'
In specifications, Murphy's Law supersedes Ohm's.
Sirius3
User
Beiträge: 18335
Registriert: Sonntag 21. Oktober 2012, 17:20

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)
Benutzeravatar
/me
User
Beiträge: 3561
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

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.
p90
User
Beiträge: 198
Registriert: Donnerstag 22. Juli 2010, 17:30

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!
Antworten