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

时间:2017-06-01 11:07:07

标签: python regex python-3.x

我正在尝试使用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条件在替换参数中是不允许的?

1 个答案:

答案 0 :(得分:1)

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

import re
def repl(x):
    return r"\frac{enter image description here}{{{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