In einigen Fällen kann rekursiv mit einer einfachen Struktur ausgedrückt werden, indem rekursiv und Generator kombiniert werden.
Es ist schwierig, mit rekursiven Klammern in regulären Ausdrücken umzugehen. In PHP und Ruby haben reguläre Ausdrücke ihre eigene Syntax, Python jedoch nicht. Durch die Verwendung einer rekursiven Funktion ist es ziemlich einfach, mit Klammern umzugehen.
import re
prog = re.compile(r"\((.+)\)")
def rec_search(s):
"Holen Sie sich Klammern rekursiv und kehren Sie in die Liste zurück"
match = prog.search(s)
r = []
if match:
r.append(match)
for i in rec_search(match.group(1)):
r.append(i)
return r
Ich mache eine Liste und sende sie an den Anrufer zurück. Es sieht ein bisschen schmutzig aus.
import re
prog = re.compile(r"\((.+)\)")
def recsearch(s):
"Holen Sie sich Klammern rekursiv und iterieren"
match = prog.search(s)
if match:
yield match
for i in rec_search(match.group(1)):
yield i
Es ist ziemlich einfach. Wenn Sie den Wert "ergeben", können Sie ihn verwerfen, so dass es einfach ist.
Beachten Sie, dass rec_search
ein Generator ist, also yield
, um ihn an den Aufrufer zurückzugeben. Andernfalls wird ein Funktionsaufruf ausgeführt, der nichts bewirkt.
>>> for i in rec_search("(1 + (1 + 2))"):
print(i)
<_sre.SRE_Match object; span=(0, 13), match='(1 + (1 + 2))'>
<_sre.SRE_Match object; span=(4, 11), match='(1 + 2)'>
Eingeführt in Python3.3. Führen Sie die durch yield from
angegebene Generatorfunktion aus und warten Sie beim Aufrufer, bis alle Ergebnisse zurückgegeben werden.
Eine Testversion der obigen Funktion.
import re
prog = re.compile(r"\((.+)\)")
def rec_search(s):
"Holen Sie sich Klammern rekursiv und iterieren"
match = prog.search(s)
if match:
yield match
yield from rec_search(match.group(1))
Es ist noch kürzer und einfacher.
import os
def iter(dirctory):
"Iterieren Sie alle Dateien im Verzeichnis"
d = os.listdir(dirctory)
if d:
for f in (os.path.join(dirctory, f) for f in d):
if os.path.isfile(f):
yield f
elif os.path.isdir(f):
yield from iter(f):
Ein Beispiel für eine rekursive Erfassung, bei der nur die Funktion "os.listdir" verwendet wird. Es wird beurteilt, ob es sich um eine Datei oder einen Ordner handelt, und wenn es sich um einen Ordner handelt, wird erneut rekursiv aufgerufen.
Kürzlich erinnerte ich mich an eine Wiederholung und versuchte verschiedene Dinge.
Es ist besser, die Syntaxanalyse für reguläre Ausdrücke zu verwenden, und es ist nicht praktikabel, da Sie den Dateinamen mit pathlib.Path (). Glob
... abrufen können.
Recommended Posts