【发布时间】: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