Regex + Capturing Groups

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
pwr
User
Beiträge: 2
Registriert: Mittwoch 16. April 2008, 22:31

Hallo,

Ich habe einen String, der (vereinfacht) in etwa so aussieht:

Code: Alles auswählen

<TEST>foo</TEST><TEST>bar</TEST><TEST>foobar</TEST>
Die Anzahl der TEST-Tags variiert.

Ich will nun mit regulären Ausdrücken den Text zwischen den einzelnen Tags in eine Liste kriegen, also groups() verwenden können. Der Ansatz wäre grundsätzlich:

Code: Alles auswählen

pattern = re.compile(r"""
    (?:
      <TEST>([^<]+)</TEST>
    )+
  """,
  re.VERBOSE
)
Das Problem ist dabei allerdings, dass ich aufgrund der Klammer (?: ... ) immer lediglich den letzten Match via groups() bekomme, also in diesem Falle nur 'foobar' anstatt wie gewünscht ['foo', 'bar', 'foobar']. Wie könnte man den Ausdruck umformulieren, sodass dies möglich wird?
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Hallo pwr, willkommen im Forum,

Du könntest aber auch einfach ``<TEST>(.*?)</TEST>`` als regulären Ausdruck verwenden, um die Inhalte zu bekommen. Oder einen XML-Parser.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
pwr
User
Beiträge: 2
Registriert: Mittwoch 16. April 2008, 22:31

Leonidas hat geschrieben:Du könntest aber auch einfach ``<TEST>(.*?)</TEST>`` als regulären Ausdruck verwenden, um die Inhalte zu bekommen. Oder einen XML-Parser.
Hallo Leonidas,

da hab ich wohl zu kompliziert gedacht - 'pattern.findall(string)' reicht bei '<TEST>(.*?)</TEST>' vollkommen, danke.
audax
User
Beiträge: 830
Registriert: Mittwoch 19. Dezember 2007, 10:38

nicht wenigstens ElementTree aus der Standardbibliothek? :oops:
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

audax hat geschrieben:nicht wenigstens ElementTree aus der Standardbibliothek? :oops:
Das geht natürlich auch.

Code: Alles auswählen

>>> from xml.etree import ElementTree
>>> doc = ElementTree.fromstring("""<ROOT><TEST>foo</TEST><TEST>bar</TEST><TEST>foobar</TEST></ROOT>""")
>>> print [item.text for item in doc.findall("TEST")]
Zu beachten ist jedoch, dass XML einen einzelnen Root-Node benötigt.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Antworten