Seite 1 von 1

Regex + Capturing Groups

Verfasst: Mittwoch 16. April 2008, 22:48
von pwr
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?

Verfasst: Mittwoch 16. April 2008, 22:55
von Leonidas
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.

Verfasst: Mittwoch 16. April 2008, 23:09
von pwr
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.

Verfasst: Mittwoch 16. April 2008, 23:52
von audax
nicht wenigstens ElementTree aus der Standardbibliothek? :oops:

Verfasst: Donnerstag 17. April 2008, 13:27
von Leonidas
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.