我正在为自定义语言编写一个pythonic解析器,截至目前我有类似的东西:
re1 = re.compile(r"...")
re2 = re.compile(r"...")
re3 = re.compile(r"...")
re4 = re.compile(r"...")
...
...
现在我正在读取输入文件,如果找到特定的关键字,那么每行都会使用特定的正则表达式。显然,这使我的生活变得生硬,因为我正在做这样的事情:
if line.find("keyword1") >= 0
# Uses re1 to match the string
invoke_handler1()
elif line.find('keyword2") >= 0
# Uses re2 to match the string
invoke_handler2()
...
同时,我不希望将给定的行与所有可能的正则表达式匹配,因为这将是一种浪费。在不抛弃我写到的所有内容之前,是否有一种优雅的方法来解决这个问题并使其更有效和可读?
答案 0 :(得分:3)
不是使用你自己编译你自己的解析器,而是可以查看一个可用于Python的many parser libraries。
答案 1 :(得分:2)
我认为这不是您正在寻找的答案,但我认为您可以更好地使用实际的Lexer和Tokenizer来解析您的语言。我建议查看并学习使用PLY来完成这项任务。
答案 2 :(得分:1)
您可能想要将地图关键字创建数据结构到RE。但老实说,我会尝试将快速失败的RE作为第一优先级,然后将它们全部循环。
快速失败RE的示例将是以“^ Sometext”开头的示例,就好像第一个字符与“S”不匹配,然后RE的其余部分不被评估。