python re.sub():特殊字符的困难(也许?)

时间:2012-03-03 17:39:54

标签: python regex

我想用re.sub来解决这个问题:

string = '\\(2 \\, e^{\\left(2 \\, x\\right)} \\sin\\left(2 \\, x\\right) + 2 \\, e^{\\left(2 \\, x\\right)} \\cos\\left(2 \\, x\\right)\\)'

进入这个:

'\\(2 \\, e^{2 \\, x} \\sin\\left(2 \\, x\\right) + 2 \\, e^{2 \\, x} \\cos\\left(2 \\, x\\right)\\)'

这是我最好的尝试,但它不起作用:

re.sub(r'(?P<left-edge>e\^{\\left\()(?P<input>.*)(?P<right-edge>\\right\)})','e^{\g<input>}',string)

Note that <input> needs to handle an arbitrary expression, while <left-edge> and <right-edge> are fixed character strings. 

我认为它与所涉及的特殊角色有关,但有几十次尝试表明它超出了我的专业知识。

2 个答案:

答案 0 :(得分:2)

必须转义正则表达式中的反斜杠。您使用了r'',因此它们不必作为Python字符串中的字符进行转义,但这还不足以将它们解释为正则表达式中的文字\字符。使用双反斜杠:

re.sub(r'(?Pe\^{\\left()(?P.*)(?P\\right)})','e\^{\\g}',string)

如果不是r'',它们必须被转义两次,即四倍,以便同时满足Python解释器和regexp引擎:

    re.sub('(?Pe\\^{\\\\left()(?P.*)(?P\\\\right)})','e\\^{\\\\g}',string)

(另外,你也忘了逃避^个问候。我在两个例子中都纠正了这一点。)

答案 1 :(得分:0)

.*匹配太多:

print(re.sub(r'e\^{\\left\((.*?)\\right\)}', r'e^{\1}', s))

Output

\(2 \, e^{2 \, x} \sin\left(2 \, x\right) + 2 \, e^{2 \, x} \cos\left(2 \, x\right)\)