对标题感到抱歉 - 我不确定如何说出来。无论如何,我在python中编写了一个编译成HTML的标记语言编译器。例如:
-(a){href:"http://www.google.com"}["Click me!"]
编译成:
<a href="http://www.google.com">Click me!</a>
在引入嵌套标签之前,它们都很有效:
-(head)[
-(title)[Nested tags]
]
-(body)[
-(div)[
-(h1)[Nested tags]
-(p)[Paragraph]
]
]
产生:
<title>Nested tags</title>
<h1>Nested tags</h1>
<p>Paragraph</p>
因为程序使用code.split("-")
拆分命令,所以它将拆分其他命令的主体内部的命令。当我将print statement
添加到编译器代码中时,我得到了:
(head)[
(title)[Nested tags]
]
(body)[
(div)[
(h1)[Nested tags]
(p)[Paragraph]
]
]
每一行都被解释为不同的命令,因此我的正则表达式(\((.+)\)\[(.+)\]
和\((.+)\)\{(.+)\}\[(.+)\]
)与head[
之类的内容不匹配。我认为最好的解决办法是让它分裂 - &#39; - &#39;除非是在命令的主体中,否则制作上述产品:
(head)[-(title)[Nested tags]
(body)[-(div)[-(h1)[Nested tags]-(p)[Paragraph]]]
然后为每个块中的每个命令运行相同的代码。
TL; DR:输入:
"-abc-def[-ignore-me]-ghi"
农产品:
["abc", "def", "[-ignore-me]", "ghi"]
非常感谢任何帮助,谢谢。
答案 0 :(得分:0)
我相信这个狡猾的代码与您想要的类似:
import re
re_name = re.compile(r'-\(([^)]+)\)')
re_args = re.compile(r'{([^}]+)}')
def parse(chars, history=[]):
body = ''
while chars:
char = chars.pop(0)
if char == '[':
name = re_name.search(body).group(1)
args = re_args.search(body)
start = '<'+name
if args:
for arg in args.group(1).split(','):
start += ' '+arg.strip().replace(':', '=')
start += '>'
end = '</'+name+'>'
history.append(start)
history.append(parse(chars))
history.append(end)
body = ''
continue
if char == ']':
return body.strip()
body += char
return history
code = '''
-(head)[
-(title)[Nested tags]
-(random)[Stuff]
]
-(body){class:"nav", other:stuff, random:tests}[
-(div)[
-(h1)[Nested tags]
-(p)[Paragraph]
]
]
'''
parsed = parse(list(code))
print(''.join(parsed))