【问题标题】:matching contents of outer most braces python匹配最外层大括号python的内容
【发布时间】:2020-11-25 16:40:15
【问题描述】:

我想在 Python 中使用匹配 r'{.*?}' 之类的正则表达式,或者使用简单的英文花括号以及其中的所有内容。 (我只关心最外面的,想忽略里面的花括号)

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

注意 r'{.*}' 不是解决方案,因为正在解析的文本中有不止一组匹配的外花括号。

例如,如果文本是:

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

我希望表达式匹配:

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

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

【问题讨论】:

  • 不幸的是,我认为您不能仅使用正则表达式来做到这一点。你可能需要一个真正的解析器。
  • “说不使用正则表达式的解决方案......没用......”——好吧,如果正则表达式根本无法满足您的要求怎么办?
  • 我怀疑正则表达式根本没有能力。如果真的不可能,提供一个证明或这种证明的来源会很好
  • @HashBr0wn 我建议阅读这个答案:stackoverflow.com/a/46334384/10785975
  • Python 的正则表达式引擎比标准的有限状态机有更多的功能,就像许多高级语言一样。但是,该帖子中的其他答案可能会有所帮助

标签: python regex curly-braces


【解决方案1】:

好吧,您可以使用带有递归方法和平衡括号的较新的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))

a demo on regex101.com

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

【讨论】:

  • 谢谢。这个正则表达式只是为了隔离我要用真正的解析器解析的代码单元。它只是我为此目的需要的一行
  • @HashBr0wn:不客气。尽管这只有在较新的 regex 模块和 - 如前所述 - 具有平衡结构的情况下才有可能。
猜你喜欢
  • 1970-01-01
  • 2016-05-22
  • 1970-01-01
  • 2016-05-21
  • 2021-09-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多