Reguläre Ausdrücke: Validieren & splitten in einem Rutsch?
Verfasst: Samstag 19. März 2011, 20:22
Nichts wichtiges, nur aus Interesse...
ich hab es nicht hinbekommen, in einem Rutsch einen String sowohl zu validieren als auch in Häppchen zu zerhacken.
Wenn ich re.match nutze, dann finde ich in .groups() immer nur ein einziges Element (das zuletzt gefundene).
Wenn ich zB mit re.findAll rüberlaufe, dann merke ich nicht, wenn etwas verbotenes im string drin war.
Einfach nur aus Prinzip fuchst es mich, zweimal den ausdruck parsen zu müssen
Konkretes Beispiel:
Die Worte der zu validierenden Sprache bestehen aus einem 'n' oder 'd' gefolgt von einer Zahl. Es können beliebig viele Worte aneinander gereiht werden (zB: n1d2n5d9d7). Als Regex: '^([dn]\d)+$'
Jetzt möchte ich einerseits sicherstellen, dass ein Ausdruck nirgendwo die Grammatik verletzt, anderseits möchte ich die char-int Paare extrahieren.
Derzeit mach ich das in zwei Durchgängen:
Ich schätze, ich steh einfach auf dem Schlauch, aber bin zu dickköpfig um es einfach gut sein zu lassen 
ich hab es nicht hinbekommen, in einem Rutsch einen String sowohl zu validieren als auch in Häppchen zu zerhacken.
Wenn ich re.match nutze, dann finde ich in .groups() immer nur ein einziges Element (das zuletzt gefundene).
Wenn ich zB mit re.findAll rüberlaufe, dann merke ich nicht, wenn etwas verbotenes im string drin war.
Einfach nur aus Prinzip fuchst es mich, zweimal den ausdruck parsen zu müssen

Konkretes Beispiel:
Die Worte der zu validierenden Sprache bestehen aus einem 'n' oder 'd' gefolgt von einer Zahl. Es können beliebig viele Worte aneinander gereiht werden (zB: n1d2n5d9d7). Als Regex: '^([dn]\d)+$'
Jetzt möchte ich einerseits sicherstellen, dass ein Ausdruck nirgendwo die Grammatik verletzt, anderseits möchte ich die char-int Paare extrahieren.
Derzeit mach ich das in zwei Durchgängen:
Code: Alles auswählen
if not re.match(r'^([nd]\d)+$', expr):
raise SomeError
for x in re.findall(r'[nd]\d', expr):
print x
