我正在尝试使用re.sub()来处理乳胶数学表达式,特别是替换字符串,例如
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条件在替换参数中是不允许的?
答案 0 :(得分:1)
您可以将匹配传递给一种方法,在该方法中您可以检查某个组是否匹配,然后使用标准Python方法动态构建替换条件:
import re
def repl(x):
return r"\frac{}{{{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