Python 正则表达式-匹配多个嵌套参数

Python 正则表达式-匹配多个嵌套参数,python,regex,latex,Python,Regex,Latex,我目前正在从事一个Python代码项目,该项目将LaTeX数学标记翻译成标准Python命令\frac{a}{b}到a/b 我以一种我认为对嵌套方程最友好的方式来处理这个问题:递归。每个方程都被分解为对象和运算符,对象(如插入语句和LaTeX项)将再次求值,直到达到最大深度 然而,当涉及到使用多个嵌套参数来分解某些LaTeX术语时,我遇到了一些regex方面的障碍,就像我上面提到的那样。在玩了一段时间的摆弄和谷歌搜索之后,我最终得到了以下结论: 唯一的问题是,我在尝试用Python计算完全相同

我目前正在从事一个Python代码项目,该项目将LaTeX数学标记翻译成标准Python命令
\frac{a}{b}
a/b

我以一种我认为对嵌套方程最友好的方式来处理这个问题:递归。每个方程都被分解为对象和运算符,对象(如插入语句和LaTeX项)将再次求值,直到达到最大深度

然而,当涉及到使用多个嵌套参数来分解某些LaTeX术语时,我遇到了一些regex方面的障碍,就像我上面提到的那样。在玩了一段时间的摆弄和谷歌搜索之后,我最终得到了以下结论:

唯一的问题是,我在尝试用Python计算完全相同的术语时遇到了这个错误:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\Python34\lib\re.py", line 206, in findall
    return _compile(pattern, flags).findall(string)
  File "C:\Python34\lib\re.py", line 288, in _compile
    p = sre_compile.compile(pattern, flags)
  File "C:\Python34\lib\sre_compile.py", line 465, in compile
    p = sre_parse.parse(p, flags)
  File "C:\Python34\lib\sre_parse.py", line 746, in parse
    p = _parse_sub(source, pattern, 0)
  File "C:\Python34\lib\sre_parse.py", line 358, in _parse_sub
    itemsappend(_parse(source, state))
  File "C:\Python34\lib\sre_parse.py", line 694, in _parse
    p = _parse_sub(source, state)
  File "C:\Python34\lib\sre_parse.py", line 358, in _parse_sub
    itemsappend(_parse(source, state))
  File "C:\Python34\lib\sre_parse.py", line 694, in _parse
    p = _parse_sub(source, state)
  File "C:\Python34\lib\sre_parse.py", line 358, in _parse_sub
    itemsappend(_parse(source, state))
  File "C:\Python34\lib\sre_parse.py", line 681, in _parse
    raise error("unexpected end of pattern")
sre_constants.error: unexpected end of pattern
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
文件“C:\Python34\lib\re.py”,第206行,在findall中
返回编译(模式、标志).findall(字符串)
文件“C:\Python34\lib\re.py”,第288行,在编译中
p=sre_compile.compile(模式、标志)
文件“C:\Python34\lib\sre_compile.py”,第465行,在compile中
p=sre_parse.parse(p,标志)
文件“C:\Python34\lib\sre_parse.py”,第746行,在parse中
p=_parse_sub(源,模式,0)
文件“C:\Python34\lib\sre_parse.py”,第358行,在_parse_sub中
itemsappend(_解析(源、状态))
文件“C:\Python34\lib\sre_parse.py”,第694行,在_parse中
p=_parse_sub(源、状态)
文件“C:\Python34\lib\sre_parse.py”,第358行,在_parse_sub中
itemsappend(_解析(源、状态))
文件“C:\Python34\lib\sre_parse.py”,第694行,在_parse中
p=_parse_sub(源、状态)
文件“C:\Python34\lib\sre_parse.py”,第358行,在_parse_sub中
itemsappend(_解析(源、状态))
文件“C:\Python34\lib\sre_parse.py”,第681行,在_parse中
引发错误(“模式意外结束”)
sre_constants.error:模式意外结束

我不太确定我的正则表达式中的问题是什么,并且在尝试让它工作的过程中一直在更改一些小东西,但没有效果……

Python的默认re模块不支持递归调用,例如
(?R)
(?0)
(递归整个模式)。但是外部regex模块将支持这一点

>>> import regex
>>> s = "\\test{5-\\tan{66}} {8+\\frac{\\cos{2}}{1}} {\\acoth{}}"
>>> regex.findall(r'(\{(?:[^{}]|(?0))*\})', s)
['{5-\\tan{66}}', '{8+\\frac{\\cos{2}}{1}}', '{\\acoth{}}']

资料来源:

你最终可以用。可通过pip获取(请参阅)。如何使用它的一个例子是


Pyparsing使用形式语法来解析字符串。它不是正则表达式,但它可能更适合您的问题。

似乎您想要这样的东西。更简单的方法是首先替换最里面的表达式。要做到这一点,你只需要禁止嵌套的花括号。你能添加一个项目的链接吗?这很有效!我希望在将来,Python会增加对递归的支持。现在,导入这个包:as-re可以正常工作