2017-06-16 4 views
0

Ich habe einen Python-String im folgende FormatPython Regex Matching Aufzählungslisten

string = 'Some text.\n1. first item\n2. second item\n3. third item\nSome more text.' 

Was ich passen will, ist der Teil \n1. first item\n2. second item\n3. third item, effektiv, die Aufzählungsliste innerhalb der Zeichenfolge. Für meine Zwecke, ich tun nicht müssen unbedingt die erste \n übereinstimmen.

Was ich bisher versucht:

  • re.findall('\n.*\d\..*', req, re.DOTALL)
  • re.findall('\n.*\d\..*?', req, re.DOTALL)

Der erste Fall findet die letzte Zeile des Textes, die ich nicht will, und den zweiten Fall finde nicht den Rest von Zeile 3. Die Hauptschwierigkeit, die ich gegenüberstelle, ist, dass ich nicht weiß, wie man die ersten .* gierig macht (und über Zeilenumbrüche passt), aber die zweite .* einfach zu einem Newline zusammenpassen lässt.

Hinweis: Die Anzahl der Elemente in der aufgezählten Zeichenfolge ist unbekannt, so kann ich nicht nur drei nummerierte Zeilen übereinstimmen. Es könnte eine beliebige Anzahl von Zeilen sein. Die angegebene Zeichenfolge ist einfach ein Beispiel, das drei aufgezählte Elemente enthält.

+0

Muss es alle Elemente in der Liste in einer großen Zeichenfolge übereinstimmen oder stimmt jedes Element überein und fügt dann jedes Element zu einer akzeptablen Sammlung hinzu? –

+0

@LewsTherin Ich nehme an, dass letzteres akzeptabel ist, ich hatte nur gehofft, dass ein einzelner Regex-Befehl damit umgehen könnte, insbesondere damit ich mehrere separate Aufzählungslisten in einer einzigen Zeichenfolge zusammenfassen kann. – zephyr

Antwort

1

Wie wäre es mit einer zeilenweisen Anpassung und einem Filter?

string = 'Some text.\n1. first item\n2. second item\n3. third item\nSome more text.' 
is_enumerated = re.compile(r"^\d+\.\s") 

matches = list(filter(lambda line: is_enumerated.match(line), string.splitlines())) 
# ['1. first item', '2. second item', '3. third item'] 

Sie können die Spiele mit \n, beitreten, wenn Sie wollen.

+1

Warum nicht einfach 're.findall ('\ d \ .. *', string)'? – zephyr

+0

Weil ich daran nicht gedacht habe, schlicht und einfach. :) Dein Vorschlag ist besser. – Tomalak