将括号放入字符串python中

时间:2014-06-06 16:53:40

标签: python regex

我有一个像这样的输入字符串:

f(x, 3*y) * 54 = 64 / (7 * x) + f(2*x, y-6)

我想得到这个输出:

(x / (3*y)) * 54 = 64 / (7 * x) + ((2*x) / (y-6))

规则: 用'f'标记的括号,删除'f',','标记必须更改为/。如果其中一个边包含表达式,则必须将其放入括号f(2,2 + x)=(2 /(2 + x))

我的代码适用于大多数测试输入,但在某些测试用例中,它会生成错误的输出:

line = sub(r"f\((.+?) *, *(.+?)\)", r"(\1 / \2)", (sub(r"f\((.+?[\+-/\*]+.+?) *, *(.+?)\)", r"f((\1),\2)", (sub(r"f\((.+?) *, *(.+?[\+-/\*]+.+?)\)", r"f(\1,(\2))", line)))))

这是我写的代码。正如我所提到的,它运作良好,但对于这一行:

f(x, 3*y) * 54 = 64 / (7 * x) + f(2*x, y-6)

我得到了这个结果:

((x / (3*y)) * 54 = 64 / (7 * x) + (2*x) / (y-6))

其中一个括号位于错误的位置。我不知道问题是什么。

1 个答案:

答案 0 :(得分:3)

你的正则表达式太复杂了。

如果x(x)无关紧要,您只需使用:

正则表达式模式:f\((\S+?),\s+(\S+)?\)

将其替换为:\( \(\1\) / \(\2\) \)

这将给出

( (x) / (3*y) ) * 54 = 64 / (7 * x) + ( (2*x) / (y-6) )

代表f(x, 3*y) * 54 = 64 / (7 * x) + f(2*x, y-6)