我目前的项目有点像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))
答案 0 :(得分:3)
引用捕获组r
和r'%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'