【问题标题】:Using if-then-else conditionals with Python regex replacement使用带有 Python 正则表达式替换的 if-then-else 条件
【发布时间】:2017-06-01 11:07:07
【问题描述】:

我正在尝试使用 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}}"

这是引发错误(“unmatched group”)的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 re 模块中没有“if-then-else 条件”功能。如果要进行条件替换,请使用 lambda 函数作为替换,而不是字符串。
  • 我在“regular-expressions.info”上发现它受 python 正则表达式引擎支持。 “JGsoft 引擎、Perl、PCRE、Python 和 .NET 框架支持条件。Ruby 从 2.0 版开始支持它们。Delphi、PHP 和 R 等具有基于 PCRE 的正则表达式功能的语言也支持条件。” regular-expressions.info/conditional.html
  • 你说得对,它存在于re模块中,我不知道!但是,您不能在替换字符串中使用它(与所有其他正则表达式标记一样,除了对捕获组的引用)。

标签: python regex python-3.x


【解决方案1】:

您可以将匹配传递给一个方法,您可以在该方法中检查某个组是否匹配,然后使用标准 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多