我正在尝试使用Python中的正则表达式标记器来解析XML文档(这是一个有限集,因此正则表达式就可以了!),并且我无法正确匹配注释。
这些注释的格式为<!--This is a comment-->注释本身可以包含各种非字母数字字符(包括“-”)的形式
我想以一种匹配方式将评论分解为以下标记:
<!--
This is a comment
-->
开始标记很容易获得,我成功地用另一个正则表达式抓住了它,但是注释正则表达式本身太贪婪了,--从结束标记处抓住了它。我希望这个正则表达式也可以捕获不一定包含在注释中的字符串,因此它也应该能够<Tag>This is text</Tag>正确返回This is text。
这是我当前用于文本的正则表达式:
[^<>]+(?!-->)
This is a comment--当我只想This is a comment使我的其他正则表达式能够抓住时,最终结果就是-->。这个正则表达式确实适用于普通标签,但是,由于结尾标签上存在“ <”,因此可以This is text从我之前的示例中正确返回。
我知道我一定不能正确使用负面的前瞻性。对我在这里做错的任何想法吗?我已经尝试过了[^<>]+(?=-->),但是那不符合任何不是这种形式的注释的内容(例如普通标签)。我认为,(?!-->)当看到该模式时,它将停止匹配,但是它似乎并不像那样工作,而是继续匹配,直到看到结尾的“>”为止。
发布一段上下文代码:
xml_scanner = re.Scanner([
(r" ", lambda scanner,token:("INDENT", token)),
(r"<[A-Za-z\d._]+(?!\/)>", lambda scanner,token:("BEGINTAG", token)),
(r"<\/[A-Za-z\d._]+(?!\/)>", lambda scanner,token:("ENDTAG", token)),
(r"<[A-Za-z\d._]+\/>", lambda scanner,token:("INLINETAG", token)),
(r"<!--", lambda scanner,token:("BEGINCOMMENT", token)),
(r"-->", lambda scanner,token:("ENDCOMMENT", token)),
(r"[^<>]+(?!-->)", lambda scanner,token:("DATA", token)),
(r"\r$", None),
])
for line in database_file:
results, remainder = xml_scanner.scan(line)
这是脚本当前唯一要做的事情。
梵蒂冈之花
HUH函数
相关分类