Durchlaufen von Python-Regex-Übereinstimmungen

70

Das muss einfacher sein als das, was mir begegnet. Mein Problem ist das Drehen einer Zeichenfolge, die so aussieht:

ABC12DEF3G56HIJ7

in

12 * ABC
3  * DEF
56 * G
7  * HIJ

Und ich kann für mein ganzes Leben keinen korrekten Satz von Loops mit REGEX-Matching entwerfen. Der Kern des Problems ist, dass der Code vollständig allgemein sein muss, da ich nicht davon ausgehen kann, wie lang die [A-Z]Fragmente sein werden und wie lang die [0-9]Fragmente sein werden.

Vielen Dank für jede Hilfe!

da5id
quelle
2
''.join("%s * %s\n" % (n, w) for w, n in re.findall(r'(?i)([a-z]+)(\d+)', input_string))
JFS

Antworten:

115

Pythons re.findallsollten für Sie funktionieren.

Live-Demo

import re

s = "ABC12DEF3G56HIJ7"
pattern = re.compile(r'([A-Z]+)([0-9]+)')

for (letters, numbers) in re.findall(pattern, s):
    print(numbers, '*', letters)
Ray Toal
quelle
61

Es ist besser, re.finditerwenn Ihr Dataset groß ist, da dies den Speicherverbrauch verringert ( findall()geben Sie eine Liste aller Ergebnisse zurück und finditer()finden Sie sie nacheinander).

import re

s = "ABC12DEF3G56HIJ7"
pattern = re.compile(r'([A-Z]+)([0-9]+)')

for m in re.finditer(pattern, s):
    print m.group(2), '*', m.group(1)
Mithril
quelle
Wenn ich mich nicht irre, sollte die letzte Zeile dieses Beispiels print m.group(2), '*', m.group(1)der gewünschten Ausgabe des OP entsprechen. Ich glaube, das m.group(0)ist das "volle" Spiel - dh ABC12, DEF3, G56, HIJ7.
DaveL17
@ DaveL17 Du hast recht, danke. Ich habe nicht viel nachgedacht, als ich diese Antwort geschrieben habe, die jetzt behoben wurde.
Mithril
1
Diese Methode bietet den Vorteil, dass Sie auf benannte Gruppen nach Namen und nicht nach Position im regulären Ausdruck zugreifen können (was sich ändern kann, wenn die Muster im regulären Ausdruck verschoben werden).
Carl G
Warum ist das besser?
Jann Poppinga
@Jann Poppinga reduziert die Speichernutzung. findallHolen Sie sich alle Ergebnisse zurück, finditererhalten Sie eins nach dem anderen.
Mithril