python - 嵌套时获取外部 "Pair"

标签 python regex

我正在使用正则表达式 <@(.+?)@>匹配模式,例如:

<@set:template default.spt @>

它工作正常,但我遇到过需要嵌套模式的情况,例如:

<@set:template <@get:oldtemplate @> @>

我没有获取父对(<@ 和@>),而是得到以下内容:

<@set:template <@get:oldtemplate @>

我不希望它获得子级,我只想要所有嵌套情况下的最外层父级。如何修复我的正则表达式以便它为我执行此操作?我想我可以做到,如果我知道如何为每个 <@ 要求有一个@>在 parent 内部,但我不知道如何强制执行。

最佳答案

您所描述的是“非常规语言”。它不能用正则表达式解析。

好的,如果您愿意限制嵌套级别,从技术上讲,您可以使用正则表达式来做到这一点。但它会很难看。

这里是如何用一些(增加的)最大嵌套深度来解析你的东西,如果你可以在你的标签中加入没有@的条件:

no nesting: <@[^@]+@>
up to 1:    <@[^@]+(<@[^@]+@>)?[^@]*@>
up to 2:    <@[^@]+(<@[^@]+(<@[^@]+@>)?[^@]*@>)?[^@]*@>
up to 3:    <@[^@]+(<@[^@]+(<@[^@]+(<@[^@]+@>)?[^@]*@>)?[^@]*@>)?[^@]*@>
...

如果你不能在你的标签中禁止单独的@,你将不得不替换所有[^@] 的实例。像这样:(?:[^<@]|<[^@]|@[^>]) .

考虑一下,然后考虑扩展您的正则表达式以解析多达 10 层的嵌套。

在这里,我会为你做:

<@(?:[^<@]|<[^@]|@[^>])+(<@(?:[^<@]|<[^@]|@[^>])+(<@(?:[^<@]|<[^@]|@[^>])+(<@(?:[
^<@]|<[^@]|@[^>])+(<@(?:[^<@]|<[^@]|@[^>])+(<@(?:[^<@]|<[^@]|@[^>])+(<@(?:[^<@]|<
[^@]|@[^>])+(<@(?:[^<@]|<[^@]|@[^>])+(<@(?:[^<@]|<[^@]|@[^>])+(<@(?:[^<@]|<[^@]|@
[^>])+(<@(?:[^<@]|<[^@]|@[^>])+@>)?(?:[^<@]|<[^@]|@[^>])*@>)?(?:[^<@]|<[^@]|@[^>]
)*@>)?(?:[^<@]|<[^@]|@[^>])*@>)?(?:[^<@]|<[^@]|@[^>])*@>)?(?:[^<@]|<[^@]|@[^>])*@
>)?(?:[^<@]|<[^@]|@[^>])*@>)?(?:[^<@]|<[^@]|@[^>])*@>)?(?:[^<@]|<[^@]|@[^>])*@>)?
(?:[^<@]|<[^@]|@[^>])*@>)?(?:[^<@]|<[^@]|@[^>])*@>

我希望我的回答表明正则表达式不是解析语言的正确工具。传统的词法分析器(分词器)和解析器组合会做得更好工作,明显更快,并将处理无限嵌套。

关于python - 嵌套时获取外部 "Pair",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16596339/

相关文章:

python - PRAW:get_submission 工作不一致

php - 将多个正则表达式合并为一个

python - 生成 PDF 文件,绘制带圆角的多边形

python - 如何使用 Python 查找 csv 列中的最高值并打印具有这些最高值的整行?

java - 如何将邮政地址与 iso 字母代码和邮政编码相匹配?

正则表达式在 R 中的逗号之前或之后提取数据

java - 正则表达式在坐标数据上出现故障

javascript - Ecmascript 正则表达式交替运算符(管道 |)是否确保评估顺序?

Python Pandas Panel4D 重新采样

Python 类变量或@property