Python的图书馆子方法" eat"捕获组

时间:2015-12-24 20:57:54

标签: python regex

介绍性的胡言乱语:

我目前的项目有点像Lisp Parser,RegEx是一个真正的奇迹,虽然它让我有点头疼这个特殊功能:

该功能应该做什么:

接收包含等式的字符串并将其格式化,以便解析器可以实际读取它(目前,这意味着在变量,大括号和数字之间插入乘法标记

它实际上做了什么:

该函数成功找到要替换的点,但是,在返回字符串的汇编中的某处,它似乎丢失了\1槽中的原始匹配模式并在那里挤压了一个〜未识别的char~字符(正方形,由[]代表,因为我无法将其粘贴到此处。)

有关为何会发生这种情况的任何见解?

代码:

import re

def eqxFormat(eq):
    vars = "x"
    for i in vars:
        eq = re.sub(r'%s([0-9\(])' % i, '%s*\1' %i, eq)
        eq = re.sub(r'([0-9\)])%s' % i, '\1*%s' %i, eq)

    eq = re.sub(r'([0-9])\(', r'\1*(', eq)
    eq = re.sub(r'\)([0-9])', r')*\1', eq)
    return eq

eq = "3(x+2(5-x))^3+2x^2+x(x^-1*exp(x))"

print(eqxFormat(eq))

输出:

3*(x+2*(5-x))^3+[]*x^2+x*[]x^-1*exp(x))

1 个答案:

答案 0 :(得分:3)

引用捕获组rr'%s*\1'时,您需要使用原始字符串r'\1*%s'

  eq = re.sub(r'%s([0-9\(])' % i, r'%s*\1' %i, eq)
  eq = re.sub(r'([0-9\)])%s' % i, r'\1*%s' %i, eq)

添加r后,您的代码将输出正确的字符串:

In [6]: eq = "3(x+2(5-x))^3+2x^2+x(x^-1*exp(x))"

In [7]: eqxFormat(eq)
Out[7]: '3*(x+2*(5-x))^3+2*x^2+x*(x^-1*exp(x))'

您还可以使用另一个'%s*\\1'来反转反斜杠,如果您不使用原始字符串或转义,则获得Ctrl-A

In [8]: "\1"
Out[8]: '\x01'
In [1]: r"\1"
Out[1]: '\\1'