【问题标题】:Regex - matching multiple nested LaTeX parameters正则表达式 - 匹配多个嵌套的 LaTeX 参数
【发布时间】:2014-10-13 06:28:32
【问题描述】:

我目前正在使用 Python 编写一个代码项目,该项目将 LaTeX 数学标记音译为标准 Python 命令 \frac{a}{b}a/b

我以一种我认为对嵌套方程最友好的方式来解决这个问题:递归。每个方程都被分解为对象和运算符,并且对象(例如括号语句和 LaTeX 术语)被再次评估,直到达到最大深度。

但是,在使用多个嵌套参数(例如我上面提到的那个)分解某些 LaTeX 术语时,我在使用正则表达式时遇到了一些障碍。在摆弄并搜索了永恒之后,我最终得到了这个:

http://regex101.com/r/oO5oG9

唯一的问题是,我在尝试在 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

我不太确定我的正则表达式有什么问题,并且已经改变了一段时间试图让它工作,但无济于事......

【问题讨论】:

  • 看来你想要这样的东西regex101.com/r/oO5oG9/2
  • 一种更简单的方法是首先替换最里面的表达式。为此,您只需要禁止嵌套大括号。
  • 你能添加一个项目的链接吗?

标签: python regex latex


【解决方案1】:

您最终可以使用pyparsing 解决它。它可以通过 pip 获得(参见PyPI)。如何使用它的一个例子是https://stackoverflow.com/a/20846900/562769

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

【讨论】:

    【解决方案2】:

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

    >>> 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{}}']
    

    来源:http://www.regular-expressions.info/recurse.html

    【讨论】:

    • 这成功了!我希望在未来,Python 会增加对递归的支持。现在,导入这个包:pypi.python.org/pypi/regex as re 工作正常
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多