Какой правильный шаблон Regexp в соответствии с именем файла виртуальной машины?
-
11-10-2019 - |
Вопрос
Документация в http://h71000.www7.hp.com/doc/731final/documentation/pdf/ovms_731_file_app.pdf (Раздел 5-1) говорит, что имя файла должно выглядеть так:
node::device:[root.][directory-name]filename.type;version
Большинство из них необязательны (например, узл, устройство, версия) - не уверены, какие из них и как правильно написать это в режиме REGEXP (включая имя каталога):
DISK1:[MYROOT.][MYDIR]FILE.DAT
DISK1:[MYDIR]FILE.DAT
[MYDIR]FILE.DAT
FILE.DAT;10
NODE::DISK5:[REMOTE.ACCESS]FILE.DAT
Решение
Смотрите документацию и источник для VMS :: filepec Модуль Perl.
Другие советы
Из Википедии полная форма на самом деле немного больше, чем эта:
NODE"accountname password"::device:[directory.subdirectory]filename.type;ver
Это заняло некоторое время, но вот выражение, которое должно принять все достоверные вариации и поместить компоненты в группы захвата.
(?:(?:(?:([^\s:\[\]]+)(?:"([^\s"]+) ([^\s"]+)")?::)?([^\s:\[\]]+):)?\[([^\s:\[\]]+)\])?([^\s:\[\]\.]+)(\.[^\s:\[\];]+)?(;\d+)?
Кроме того, из того, что я могу сказать, ваш пример
DISK1:[MYROOT.][MYDIR]FILE.DAT
не является действительным именем. Я считаю, что разрешена только одна пара скобок. Надеюсь, это поможет!
Возможно, вы могли бы придумать одну сложную регуляцию для этого, но будет гораздо проще читать ваш код, если вы будете работать слева от слева к правой части, если он есть. Ниже приведено какой -то код Python, который делает именно это:
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))
и выход
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