Wenn Sie überprüfen wollen, ob etwas einen regulären Ausdruck übereinstimmt, wenn ja, die erste Gruppe drucken, was Sie tun ..Alternative zum `match = re.match(); wenn Übereinstimmung: ... `Idiom?
import re
match = re.match("(\d+)g", "123g")
if match is not None:
print match.group(1)
Das ist völlig pedantisch, aber die Zwischen match
Variable ist ein bisschen ärgerlich ..
Sprachen wie Perl tun dies, indem neue $1
Schaffung .. $9
Variablen für Match-Gruppen, wie ..
if($blah ~= /(\d+)g/){
print $1
}
von this reddit comment,
with re_context.match('^blah', s) as match:
if match:
...
else:
...
..welche ich dachte, war eine interessante Idee, so schrieb ich eine einfache Implementierung davon: Es
#!/usr/bin/env python2.6
import re
class SRE_Match_Wrapper:
def __init__(self, match):
self.match = match
def __exit__(self, type, value, tb):
pass
def __enter__(self):
return self.match
def __getattr__(self, name):
if name == "__exit__":
return self.__exit__
elif name == "__enter__":
return self.__name__
else:
return getattr(self.match, name)
def rematch(pattern, inp):
matcher = re.compile(pattern)
x = SRE_Match_Wrapper(matcher.match(inp))
return x
return match
if __name__ == '__main__':
# Example:
with rematch("(\d+)g", "123g") as m:
if m:
print(m.group(1))
with rematch("(\d+)g", "123") as m:
if m:
print(m.group(1))
(Diese Funktionalität theoretisch in das _sre.SRE_Match
Objekt gepatcht werden könnte)
wäre schön, wenn Sie die Ausführung des Codeblocks der with
Anweisung überspringen könnten, wenn es keine Übereinstimmung gäbe, die das vereinfachen würde.
with rematch("(\d+)g", "123") as m:
print(m.group(1)) # only executed if the match occurred
..aber dies unmöglich scheint anhand dessen, was ich von PEP 343
Irgendwelche Ideen ableiten kann? Wie gesagt, das ist wirklich trivialer Ärger, fast bis zum Code-Golf.
„fast bis zum Punkt der Code-Golf ist“ nicht einverstanden ist. Dies ist absolut code golf. Ich kann nicht sehen, was "nervig" ist, wenn eine Variable zur Darstellung der Zustandsänderung gesetzt wird. –
Ich habe sage ich pedantisch wurde .. – dbr
ähnliche Diskussion bereits auf SO: http://stackoverflow.com/questions/447086/pythons-re-module-saving-state –