Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python “获得外部的”;配对;嵌套时_Python_Regex - Fatal编程技术网

Python “获得外部的”;配对;嵌套时

Python “获得外部的”;配对;嵌套时,python,regex,Python,Regex,我使用regex来匹配以下模式: <@set:template default.spt @> 它工作正常,但我遇到过需要嵌套模式的情况,例如: <@set:template <@get:oldtemplate @> @> 我没有得到父对象对(),而是得到以下内容: <@set:template <@get:oldtemplate @> 我不认为正则表达式可以做到这一点,请看下面的答案,其中有类似的问题。正则表达式的功能不足以处理

我使用regex
来匹配以下模式:

<@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
包无法处理任意嵌套级别。的答案也应该可以解决您的问题。可以允许
@
,同时不使用带有
(?:(?!@>)*
的结束标记。我一定喜欢最后的结果。
<@(?:[^<@]|<[^@]|@[^>])+(<@(?:[^<@]|<[^@]|@[^>])+(<@(?:[^<@]|<[^@]|@[^>])+(<@(?:[
^<@]|<[^@]|@[^>])+(<@(?:[^<@]|<[^@]|@[^>])+(<@(?:[^<@]|<[^@]|@[^>])+(<@(?:[^<@]|<
[^@]|@[^>])+(<@(?:[^<@]|<[^@]|@[^>])+(<@(?:[^<@]|<[^@]|@[^>])+(<@(?:[^<@]|<[^@]|@
[^>])+(<@(?:[^<@]|<[^@]|@[^>])+@>)?(?:[^<@]|<[^@]|@[^>])*@>)?(?:[^<@]|<[^@]|@[^>]
)*@>)?(?:[^<@]|<[^@]|@[^>])*@>)?(?:[^<@]|<[^@]|@[^>])*@>)?(?:[^<@]|<[^@]|@[^>])*@
>)?(?:[^<@]|<[^@]|@[^>])*@>)?(?:[^<@]|<[^@]|@[^>])*@>)?(?:[^<@]|<[^@]|@[^>])*@>)?
(?:[^<@]|<[^@]|@[^>])*@>)?(?:[^<@]|<[^@]|@[^>])*@>