我有一个代码,我只想返回 /X/Y/Z/C、/X/Y/Z/D、/X/Y/Z/E(无论 -tree 之后是什么)。
它实际上应该读取文件,忽略所有内容,直到看到 WFS,然后获取 {} 中的信息,找到树,然后给我返回的路径。
我是 Python 初学者。匹配模式不起作用,因为我认为路径每天都在变化。
任何帮助将不胜感激。
代码:
DEFAULTS
{
FS
{
-A AAA
-B
} -aaaaaa
C
{
}
}
D "FW0"
{
}
WFS "C:" XXXX:"/C"
{
-trees
"/X/Y/Z/C"
"/X/Y/Z/D"
"/X/Y/Z/E"
-A AAA
}
基于状态机的词法分析器可以可靠地完成这一任务。
它识别我们感兴趣的文件结构:嵌套花括号、命名节(下一行上的标识符和左大括号;这一个只关心顶级节)和子句(以-identifier
在顶级部分内,后面可能是数据行,并以另一个子句或该部分的末尾结束)。
然后它继续读取文件并打印找到的数据行(如果它们恰好位于我们感兴趣的部分和子句中)。它还会在找到它们时设置一个标志,以便在该子句结束后立即退出。
f = open("t.txt")
import re
identifier=None
brace_level=0
section=None
clause=None
req_clause_found=False
def in_req_clause(): return section=='WFS' and clause=='trees'
for l in (l.strip() for l in f):
if req_clause_found and not in_req_clause(): break
m=re.match(r'[A-Z]+',l) #adjust if section names can be different
if m and section is None:
identifier=m.group(0)
continue
m=re.match(r'\{(\s|$)',l)
if m:
brace_level+=1
if identifier is not None and brace_level==1:
section=identifier
identifier=None
continue
else: identifier=None
m=re.match(r'\}(\s|$)',l)
if m:
brace_level-=1
if brace_level==0: section=None
clause=None
continue
m=re.match(r'-([A-Za-z]+)',l) #adjust if clause names can be different
if m and brace_level==1:
clause=m.group(1)
continue
m=re.match(r'"(.*)"$',l)
if m and in_req_clause():
print m.group(1)
req_clause_found=True
continue
在示例中,输出
/X/Y/Z/C
/X/Y/Z/D
/X/Y/Z/E
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)