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

在Python正则表达式替换中使用if-then-else条件,python,regex,python-3.x,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代码(“不匹配组”) 那么这是一个语法问题吗?如果是这样,问题是什么?或者如果替换参数

我试图使用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代码(“不匹配组”)


那么这是一个语法问题吗?如果是这样,问题是什么?或者如果替换参数中不允许使用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}}
重新导入
def repl(x):
返回r“\frac{{{{0}}}{{{1}-{2}}}”.format(x.group(“numer”),
(x.group(“denom1”)如果x.group(“neg”)或者x.group(“denom2”),
(x.group(“denom2”)如果x.group(“neg”)或者x.group(“denom1”))
string1=r“-\frac{2}{-4\sqrt{2}+2}”
string2=r“\frac{2}{-4\sqrt{2}+2}”
pattern=r“(?P-?\\frac{(?P\d*)}{-(?P\d*?\\sqrt{\d*})\+(?P\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 re模块中没有“if-then-else-conditional”特性。如果要进行条件替换,请使用lambda函数作为替换,而不是字符串。我在“regular expressions.info”上找到了python正则表达式引擎支持它。“JGsoft引擎、Perl、PCRE、Python和.NET framework都支持条件。Ruby从2.0版开始就支持条件。Delphi、PHP和R等具有基于PCRE的正则表达式功能的语言也支持条件。”你说得对,它存在于re模块中,我不知道!但是,您不能在替换字符串中使用它(与除对捕获组的引用之外的所有其他正则表达式标记一样)。
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)
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}}