What's the correct regexp pattern to match a VMS filename?
http://h71000.www7.hp.com/doc/731final/documentation/pdf/ovms_731_file_app.pdf(第5-1节)中的文档说文件名应如下所示:
1 | node::device:[root.][directory-name]filename.type;version |
它们中的大多数是可选的(如节点,设备,版本) - 不确定哪些以及如何在正则表达式中正确编写它(包括目录名称):
1 2 3 4 5 6 7 8 9 | DISK1:[MYROOT.][MYDIR]FILE.DAT DISK1:[MYDIR]FILE.DAT [MYDIR]FILE.DAT FILE.DAT;10 NODE::DISK5:[REMOTE.ACCESS]FILE.DAT |
请参阅VMS :: Filespec Perl模块的文档和源代码。
从维基百科,完整的表格实际上不仅仅是:
1 | NODE"accountname password"::device:[directory.subdirectory]filename.type;ver |
这个花了一段时间,但这里有一个表达式应该接受所有有效的变体,并将组件放入捕获组。
1 | (?:(?:(?:([^\s:\[\]]+)(?:"([^\s"]+) ([^\s"]+)")?::)?([^\s:\[\]]+):)?\[([^\s:\[\]]+)\])?([^\s:\[\]\.]+)(\.[^\s:\[\];]+)?(;\d+)? |
另外,从我所知道的,你的例子
1 | DISK1:[MYROOT.][MYDIR]FILE.DAT |
不是有效的名称。 我相信只允许一对括号。 我希望这有帮助!
你可能会为此提出一个复杂的正则表达式,但是如果你从左到右按照每个部分的方式工作,那么读取你的代码要容易得多。 以下是一些Python代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | 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)) |
而输出是
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | 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 |