python - 使用 if-then-else 条件和 Python 正则表达式替换

标签 python regex python-3.x

我正在尝试使用 re.sub() 来操作 latex 数学表达式,特别是替换字符串,例如

string1 = "- \frac{2}{- 4 \sqrt{2} + 2}" # with "\frac{2}{4 \sqrt{2} - 2}"

string2 = "\frac{2}{- 4 \sqrt{2} + 2}" # with "\frac{2}{2 - 4 \sqrt{2}}"

这是引发错误的 python 代码(“不匹配的组”)。

pattern = r"(?P<neg>- )?\\frac{(?P<numer>\d*)}{- (?P<denom1>\d* ?\\sqrt{\d*}) \+ (?P<denom2>\d*)\}"
replacement = r"\\frac{\g<numer>}{(?(\g<neg>)(\g<denom2> - \g<denom1>)|(\g<denom1> - \g<denom2>))}"
key = sub(pattern, replacement, string)

我确信模式匹配正确,因为我尝试使用 re.sub() 而替换参数中没有条件,并且代码工作正常。当然,在这种情况下,该代码适用于 string1 或 string2,但不能同时适用于两者。

pattern = r"(?P<neg>- )?\\frac{(?P<numer>\d*)}{- (?P<denom1>\d* ?\\sqrt{\d*}) \+ (?P<denom2>\d*)\}"
replacement = r"\\frac{\g<numer>}{\g<denom1> - \g<denom2>}"
key = sub(pattern, replacement, string)

那么这是一个语法问题吗?如果是这样,问题是什么?或 If-then-else 条件语句不允许出现在替换参数中?

最佳答案

您可以将匹配传递给一个方法,在该方法中您可以检查某个组是否匹配,然后使用标准 Python 方法应用您的条件动态构建替换:

import re
def repl(x):
    return r"\frac{{{0}}}{{{1} - {2}}}".format(x.group("numer"),
        (x.group("denom1") if x.group("neg") else x.group("denom2")),
        (x.group("denom2") if x.group("neg") else x.group("denom1")))

string1 = r"- \frac{2}{- 4 \sqrt{2} + 2}"
string2 = r"\frac{2}{- 4 \sqrt{2} + 2}"
pattern = r"(?P<neg>- )?\\frac{(?P<numer>\d*)}{- (?P<denom1>\d* ?\\sqrt{\d*}) \+ (?P<denom2>\d*)\}"
print(re.sub(pattern, repl, string1)) # => \frac{2}{4 \sqrt{2} - 2}
print(re.sub(pattern, repl, string2)) # => \frac{2}{2 - 4 \sqrt{2}}

参见Python demo

关于python - 使用 if-then-else 条件和 Python 正则表达式替换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44305870/

相关文章:

python-3.x - 模式识别和序列检测

Python:在井字游戏板上随机选择一个点

javascript - 检测大括号之间的文本(不包括字符串)。部分代码完成

python - 如何使用 sqlalchemy 在 sqlite 中使用正则表达式函数?

python - Eric4 Python IDE - 自动保存和快速脚本/项目启动、运行

python 记录 : Custom Python LogRecord Throwing an error

php - 如何使用 PHP preg_replace 链接 Twitter 用户名?

python - 如何使用 matplotlib 缩放轴标签?

python - CNTK没有属性LeakyReLU

python - 使用 pandas 比较两个 Excel 文件