可能的重复:
在 Python 中将嵌套结构与正则表达式匹配 https://stackoverflow.com/questions/1099178/matching-nested-structures-with-regular-expressions-in-python
我无法解决这个问题。我有一个像下面这样的字符串:
Lorem ipsum dolor sit amet [@a xxx yyy [@b xxx yyy [@c xxx yyy]]] lorem ipsum sit amet
我的任务是提取命令(它们总是以[@并以]) 及其子命令。结果就像
[
[@a xxx yyy [@b xxx yyy [@c xxx yyy]]], # the most outer
[@b xxx yyy [@c xxx yyy]], # the middle one
[@c xxx yyy] # the inner most
]
将不胜感激。问题是这些类型的命令可能出现在很长的文本消息中,因此“高性能”的解决方案会很好。
我大部分时间都在玩弄一些正则表达式模式,比如
(\[@.*?\]\s) # for the outer one
但我没有看到匹配中间和内部的光。更复杂的是,嵌套命令的数量是可变的......
一些特殊的正则表达式可能是解决方案吗?我读过有关前瞻和后视的内容,但不知道如何在这种特殊情况下使用它们。
谢谢一堆!
UPDATE
@Cyborgx37 向我指出了另一篇使用 pyparsing 包的帖子。如果有一个没有外部包或库的解决方案就好了。但 pyparsing 肯定解决了这个问题!
C# 有递归/嵌套正则表达式,我不相信 Python 有。您可以对以前的结果重新运行 RegEx 搜索,但这可能比仅仅创建自定义解析器效率低(RegEx 对于如此简单的搜索的开销)。您搜索“[@”和“]”的文本并不是很复杂。
这是一个可以完成这项工作的自定义解析器(JavaScript)。
var txt = "Lorem ipsum dolor sit amet [@a xxx yyy [@b xxx yyy [@c xxx yyy]]] lorem ipsum sit amet";
function parse(s) {
var stack = [];
var result = [];
for(var x=0; x<s.length; x++) {
var c = s.charAt(x);
if(c == '[' && x+1 < s.length-1 && s.charAt(x+1) == '@') {
for(var y=0; y<stack.length; y++)
stack[y] += "[@";
stack.push("[@");
x++;
} else if(c == ']' && stack.length > 0) {
for(var y=0; y<stack.length; y++)
stack[y] += "]";
result.push(stack.pop());
} else {
for(var y=0; y<stack.length; y++)
stack[y] += c;
}
}
return result;
}
parse(txt);
它快速循环遍历文本的所有字符(仅一次),并使用堆栈和 if...if else...else 条件分别压入、弹出和修改堆栈中的值。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)