4 Stimmen

Python re.search funktioniert nicht bei mehrzeiligen Zeichenketten

Ich habe diese Datei im String geladen:

// einige vorherige Sachen
static char header_data[] = {
    1,1,1,1,1,1,0,0,0,0,1,1,1,1,1,1,
    1,1,1,0,1,1,0,1,1,0,1,1,0,1,1,1,
    1,1,0,1,0,1,0,1,1,0,1,0,1,0,1,1,
    1,0,1,1,1,0,0,1,1,0,0,1,1,1,0,1,
    0,0,0,1,1,1,1,1,1,1,1,1,1,0,1,1,
    1,0,0,0,1,1,0,1,1,1,1,1,0,1,1,1,
    0,1,0,0,0,1,0,0,1,1,1,1,0,0,0,0,
    0,1,1,0,0,0,0,0,0,1,1,1,1,1,1,0,
    0,1,1,1,0,0,0,0,0,0,1,1,0,1,1,0,
    0,0,0,0,1,0,0,0,1,0,0,1,0,1,0,0,
    1,1,1,0,1,1,0,0,1,1,0,0,0,1,1,1,
    1,1,0,1,1,1,1,1,1,1,1,0,0,0,1,1,
    1,0,1,1,

14voto

Tim Pietzcker Punkte 311448

Sie müssen die re.S Flagge verwenden, nicht re.M.

  • re.M (re.MULTILINE) steuert das Verhalten von ^ und $ (ob sie am Anfang/Ende des gesamten Strings oder jeder Zeile übereinstimmen).
  • re.S (re.DOTALL) steuert das Verhalten des . und ist die Option, die Sie benötigen, wenn Sie möchten, dass der Punkt Zeilenumbrüche übereinstimmt.

Siehe auch die Dokumentation.

3voto

wenzul Punkte 3750

und dann irgendwie verarbeiten.

Hier gehen wir vor, um eine verwendbare Liste aus der Datei zu erhalten:

import re
match = re.search(r"static char header_data\[\] = {(.*?)};", src, re.DOTALL)
if match:
    header_data = "".join(match.group(1).split()).split(',')
    print header_data

.*? ist ein nicht-greedy Match, so dass du wirklich nur den Wert zwischen diesen geschweiften Klammern bekommst.

Eine ausdrücklichere Methode ohne DOTALL oder MULTILINE wäre

match = re.search(r"static char header_data\[\] = {([01,\s\r\n]*?)};", src)

0voto

Sriram Punkte 513

Wenn sich das Dateiformat nicht ändert, sollten Sie möglicherweise nicht auf re zurückgreifen, sondern Slices verwenden. Etwas in dieser Art könnte nützlich sein

>>> file_in_string
'\n// einige vorherige Sachen\nstatic char header_data[] = {\n    1,1,1,1,1,1,0,0,0
,0,1,1,1,1,1,1,\n    1,1,1,0,1,1,0,1,1,0,1,1,0,1,1,1,\n    1,1,0,1,0,1,0,1,1,0,1
,0,1,0,1,1,\n    1,0,1,1,1,0,0,1,1,0,0,1,1,1,0,1,\n    0,0,0,1,1,1,1,1,1,1,1,1,1
,0,1,1,\n    1,0,0,0,1,1,0,1,1,1,1,1,0,1,1,1,\n    0,1,0,0,0,1,0,0,1,1,1,1,0,0,0
,0,\n    0,1,1,0,0,0,0,0,0,1,1,1,1,1,1,0,\n    0,1,1,1,0,0,0,0,0,0,1,1,0,1,1,0,\
n    0,0,0,0,1,0,0,0,1,0,0,1,0,1,0,0,\n    1,1,1,0,1,1,0,0,1,1,0,0,0,1,1,1,\n
 1,1,0,1,1,1,1,1,1,1,1,0,0,0,1,1,\n    1,0,1,1,1,0,0,

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X