python中的一个简单正则表达式

时间:2013-05-20 00:35:12

标签: python regex

我的程序是一个简单的计算器,所以我需要解析用户输入的表达式,以使输入更加用户友好。我知道我可以用正则表达式做到这一点,但我对此并不熟悉。

所以我需要转换这样的输入:

import re
input_user = "23.40*1200*(12.00-0.01)*MM(H2O)/(8.314 *func(2*x+273.15,x))"
re.some_stuff( ,input_user) # ????

在此:

"23.40*1200*(12.00-0.01)*MM('H2O')/(8.314 *func('2*x+273.15',x))"

只需在括号内添加这些简单的引号即可。我怎么能这样做?

更新:

为了更清楚,我希望在每个字符序列之后添加简单引号“MM(”和之后的“)”之后,以及在每个字符序列之后添加简单引号“func(”和之前的“,”来之后。

1 个答案:

答案 0 :(得分:2)

这是正则表达式可以工作的东西,但它们可能会导致重大问题,除非您确切考虑输入的内容。例如,MM(...)中的任何内容都可以包含自己的括号吗? func中的第一个表达式(包含逗号吗?如果两个问题的答案都不是,那么以下内容可以起作用:

 input_user2 = re.sub(r'MM\(([^\)]*)\)', r"MM('\1')", input_user)
 output = re.sub(r'func\(([^,]*),', r"func('\1',", input_user)

但是,如果任何一个问题的答案都是肯定的,那么会工作,即使没有这个问题,也可能会出现问题,具体取决于您希望接收的输入类型。基本上,第一个re.sub在这里寻找MM(('MM('),后跟任何不是近括号的字符(包括0)('([^)] *)')然后存储为一个组(由额外的括号引起),然后是一个闭括号。它用第二个参数中的字符串替换该部分,其中\ 1由模式中的第一个和唯一的组替换。 .sub的工作方式类似,寻找任何不是逗号的字符。

如果任一问题的答案都是肯定的,那么正则表达式不适合解析,因为您的语言不会是常规的。 The answer to this question在讨论不同的应用程序时,可能会更深入地了解这个问题。