0

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

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

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(”和之后的“,”之后.

4

1 回答 1

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 的工作方式类似,查找任意数量的非逗号字符。

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

于 2013-05-20T01:38:37.490 回答