我正在尝试使用 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 - 使用 if-then-else 条件和 Python 正则表达式替换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44305870/