Python “获得外部的”;配对;嵌套时
我使用regexPython “获得外部的”;配对;嵌套时,python,regex,Python,Regex,我使用regex来匹配以下模式: <@set:template default.spt @> 它工作正常,但我遇到过需要嵌套模式的情况,例如: <@set:template <@get:oldtemplate @> @> 我没有得到父对象对(),而是得到以下内容: <@set:template <@get:oldtemplate @> 我不认为正则表达式可以做到这一点,请看下面的答案,其中有类似的问题。正则表达式的功能不足以处理
来匹配以下模式:
<@set:template default.spt @>
它工作正常,但我遇到过需要嵌套模式的情况,例如:
<@set:template <@get:oldtemplate @> @>
我没有得到父对象对(),而是得到以下内容:
<@set:template <@get:oldtemplate @>
我不认为正则表达式可以做到这一点,请看下面的答案,其中有类似的问题。正则表达式的功能不足以处理任意级别的嵌套,如果您只有两个级别的嵌套,那么这应该是可能的,但正则表达式可能不是执行此任务的最佳工具。您所描述的是一种“非规则语言”。无法使用regexp对其进行分析
好的,如果您愿意对嵌套级别进行限制,从技术上讲,您可以使用regexp进行限制。但这将是丑陋的
下面是如何通过几个(增加)最大嵌套深度来解析您的东西,如果您可以将@的条件放在标记中:
no nesting: <@[^@]+@>
up to 1: <@[^@]+(<@[^@]+@>)?[^@]*@>
up to 2: <@[^@]+(<@[^@]+(<@[^@]+@>)?[^@]*@>)?[^@]*@>
up to 3: <@[^@]+(<@[^@]+(<@[^@]+(<@[^@]+@>)?[^@]*@>)?[^@]*@>)?[^@]*@>
...
我希望我的答案表明,regexp不是解析语言的正确工具。传统的lexer(标记器)和解析器组合将做得更好,速度更快,并且可以处理不确定的嵌套。@casimirithippolyte python您需要regex
包来完成这项工作。默认的re
包无法处理任意嵌套级别。的答案也应该可以解决您的问题。可以允许@
和
,同时不使用带有(?:(?!@>)*
的结束标记。我一定喜欢最后的结果。
<@(?:[^<@]|<[^@]|@[^>])+(<@(?:[^<@]|<[^@]|@[^>])+(<@(?:[^<@]|<[^@]|@[^>])+(<@(?:[
^<@]|<[^@]|@[^>])+(<@(?:[^<@]|<[^@]|@[^>])+(<@(?:[^<@]|<[^@]|@[^>])+(<@(?:[^<@]|<
[^@]|@[^>])+(<@(?:[^<@]|<[^@]|@[^>])+(<@(?:[^<@]|<[^@]|@[^>])+(<@(?:[^<@]|<[^@]|@
[^>])+(<@(?:[^<@]|<[^@]|@[^>])+@>)?(?:[^<@]|<[^@]|@[^>])*@>)?(?:[^<@]|<[^@]|@[^>]
)*@>)?(?:[^<@]|<[^@]|@[^>])*@>)?(?:[^<@]|<[^@]|@[^>])*@>)?(?:[^<@]|<[^@]|@[^>])*@
>)?(?:[^<@]|<[^@]|@[^>])*@>)?(?:[^<@]|<[^@]|@[^>])*@>)?(?:[^<@]|<[^@]|@[^>])*@>)?
(?:[^<@]|<[^@]|@[^>])*@>)?(?:[^<@]|<[^@]|@[^>])*@>