Sie könnten wahrscheinlich mit einem einzigen komplizierten Regex dafür kommen, aber es wird viel einfacher sein, Ihren Code zu lesen, wenn Sie Ihren Weg von links nach rechts arbeiten und jeden Abschnitt abstreifen, wenn er da ist. Hier finden Sie einige Python-Code, der tut genau das:
lines = ["DISK1:[MYROOT.][MYDIR]FILE.DAT", "DISK1:[MYDIR]FILE.DAT", "[MYDIR]FILE.DAT", "FILE.DAT;10", "NODE::DISK5:[REMOTE.ACCESS]FILE.DAT"]
node_re = "(\w+)::"
device_re = "(\w+):"
root_re = "\[(\w+)\.]"
dir_re = "\[(\w+)]"
file_re = "(\w+)\."
type_re = "(\w+)"
version_re = ";(.*)"
re_dict = {"node": node_re, "device": device_re, "root": root_re, "directory": dir_re, "file": file_re, "type": type_re, "version": version_re}
order = ["node", "device", "root", "directory", "file", "type", "version"]
for line in lines:
i = 0
print line
for item in order:
m = re.search(re_dict[item], line[i:])
if m is not None:
print " " + item + ": " + m.group(1)
i += len(m.group(0))
und der Ausgang ist
DISK1:[MYROOT.][MYDIR]FILE.DAT
device: DISK1
root: MYROOT
directory: MYDIR
file: FILE
type: DAT
DISK1:[MYDIR]FILE.DAT
device: DISK1
directory: MYDIR
file: FILE
type: DAT
[MYDIR]FILE.DAT
directory: MYDIR
file: FILE
type: DAT
FILE.DAT;10
file: FILE
type: DAT
version: 10
NODE::DISK5:[REMOTE.ACCESS]FILE.DAT
node: NODE
device: DISK5
directory: REMOTE.ACCESS
file: FILE
type: DAT
Ist der Text in den Klammern "[]" im obigen Beispiel ebenfalls optional? Sind "MYROOT.", "MYDIR" und "REMOTE.ACCESS" Aliase für etwas oder sind diese Zeichenfolgenliterale? –
Soweit ich das beurteilen kann, sind die eckigen Klammern Litterals und nicht optional. Ich habe die genauen Spezifikationen für die zulässigen Verzeichnisnamen und Zeichen nicht gefunden. Mein Verständnis von der Spezifikation ist, dass die Verzeichnisnamen mit STRING Punkt STRING – bengrine
identifiziert werden Beachten Sie auch, dass jeder Verzeichnisname und der Dateiname auf 9 Zeichen oder weniger beschränkt sind. Knoten und Gerät haben auch Längenbeschränkungen (aber ich erinnere mich nicht, was sie sind). –