Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.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_Curly Braces - Fatal编程技术网

Python 最外层大括号的匹配内容

Python 最外层大括号的匹配内容,python,regex,curly-braces,Python,Regex,Curly Braces,我想在Python中使用一个正则表达式,它可以匹配像r'{.*.}'这样的东西,或者在简单的英语中使用大括号以及其中的所有内容。(我只关注最外面的,不考虑内部的花括号) 这个表达式的问题是,使用嵌套的大括号时,您无法获得所有内容,因为您在第一个右括号处停止,即使它不是匹配的大括号 注意:r“{.*}”不是解决方案,因为正在解析的文本中有多组匹配的外部大括号 例如,如果文本为: struct my_struct{ double d; struct {int i;, char c;}

我想在Python中使用一个正则表达式,它可以匹配像r'{.*.}'这样的东西,或者在简单的英语中使用大括号以及其中的所有内容。(我只关注最外面的,不考虑内部的花括号)

这个表达式的问题是,使用嵌套的大括号时,您无法获得所有内容,因为您在第一个右括号处停止,即使它不是匹配的大括号

注意:r“{.*}”不是解决方案,因为正在解析的文本中有多组匹配的外部大括号

例如,如果文本为:

struct my_struct{
    double d;
    struct {int i;, char c;} s;
};
我希望表达式匹配:

{
    double d;
    struct{int i; char c;} s;
}

任何关于如何解释嵌套花括号的提示都将不胜感激。请注意,我正在寻找一个空白没有任何意义。表示不使用正则表达式、不使用Python或以不同方式进行的解决方案没有用处,因为这是更大的正则表达式的一部分。

好的,您可以使用带有递归方法和平衡括号的较新的
regex
模块:

\{(?:[^{}]+|(?R))+\}

Python
中,这可能是

import regex as re

rx = re.compile(r'\{(?:[^{}]+|(?R))+\}')

for match in rx.finditer(you_data_as_string):
    print(match.group(0))


如其他人所指出的,您可能需要考虑其他方法(即某种解析器)。试图用正则表达式分析源代码往往会很快变得不干净。

不幸的是,我不认为你只能用正则表达式来分析源代码。你可能需要一个真正的解析器。“说不使用regex的解决方案……是没有用的……”——好吧,如果regex根本不能满足你的要求呢?我怀疑regex根本不能满足你的要求。如果真的不可能的话,这种证明的证据或来源将是nice@HashBr0wn我建议阅读这个答案:Python的正则表达式引擎比标准的有限状态机有更多的功能,就像许多高级语言一样。不过,该帖子中的其他答案可能会有所帮助,谢谢。这个正则表达式只是隔离我要用真正的解析器解析的代码单元。这只是我需要的一条线purpose@HashBr0wn:不客气。尽管这仅在较新的
regex
模块和平衡结构的情况下才可能实现。