如何将字符串拆分为列表而不是括号?

时间:2014-08-30 16:53:17

标签: python regex

对标题感到抱歉 - 我不确定如何说出来。无论如何,我在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"]

非常感谢任何帮助,谢谢。

1 个答案:

答案 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))