为了账号安全,请及时绑定邮箱和手机立即绑定

正则表达式:将一个字符串匹配一个模式(可能不存在)

正则表达式:将一个字符串匹配一个模式(可能不存在)

慕妹3242003 2021-03-30 12:07:05
我正在尝试使用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)这是脚本当前唯一要做的事情。
查看完整描述

2 回答

?
梵蒂冈之花

TA贡献1900条经验 获得超5个赞

您的问题是,在中[^<>]+(?!-->),先行断言仅在This is a comment--匹配后才尝试,并且当然会成功,因为-->在正则表达式引擎已结束的位置上没有。

因此,您必须在字符串的每个位置检查前瞻。适当的习惯用法通常是:

(?:(?!-->).)*

或者,就您而言

(?:(?!-->)[^<>])*

这会匹配除尖括号之外的任意数量的字符,直到-->出现或到达字符串的末尾为止。


查看完整回答
反对 回复 2021-04-01
?
HUH函数

TA贡献1836条经验 获得超4个赞

您需要使用积极的前瞻性,以确保此模式领先于您的比赛。

[^<>]+(?=-->)

如果要使其更具通用性,使其也与其他标签的内容匹配,则可以在超前断言内使用替代:

[^<>]+(?=-->|</)

在Regexr上看到它

如果前面有“ -->”或“ </” ,则此正则表达式将停止。


查看完整回答
反对 回复 2021-04-01
  • 2 回答
  • 0 关注
  • 406 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号