我正在使用python解析一个spice文件,其中包含字符串数学表达式,并且我正在将文本文件转换为python脚本。
文件中的数学表达式示例如下:
expr = 'k1 + 4.35k + 3.69meg*(pow(2.4u, 2*km2))'我想找出表达式中的所有比例因子,并将它们转换为它们的指数值:
scaling_factors = {
'g' : 'e9',
'meg': 'e6',
'k' : 'e3',
'm' : 'e-3',
'u' : 'e-6',
'n' : 'e-9',
}我想要的输出是这样的:
converted_expr = 'k1 + 4.35e3 + 3.69e6*(pow(2.4e-6, 2*km2))'我试过这个:
digits_re = r"([0-9]*\.[0-9]+|[0-9]+)k"
sample = 'k1 + 4.3k'
print(re.sub(digits_re, digits_re.replace('k', 'e3'), sample))输出:
k1 + \\de3但它不起作用
发布于 2018-05-28 18:07:09
使用否定前视((?<=...))来确保符号前有一个数字,并使用单词边界断言(\b)来捕捉"km2“的情况:
import re
expr = re.sub(r"(?<=\d)k\b", "e3", expr)如果你想避免多次这样做,这里有一个使用函数作为替换值的诀窍:
def sn_replace(match):
return scaling_factors[match.group(1)]
expr = re.sub(r"(?<=\d)(g|k|meg|m|u|n)\b", sn_replace, expr)当re.sub的第二个参数是函数时,不是用文本替换匹配,而是使用match对象调用该函数,并将其返回值用作替换。
发布于 2018-05-28 18:25:11
写得有点快,所以可能不是完美的,但是像这样的东西?
import re
scaling_factors = {
'g' : 'e9',
'meg': 'e6',
'k' : 'e3',
'm' : 'e-3',
'u' : 'e-6',
'n' : 'e-9',
}
expr = 'k1 + 4.35k + 3.69meg*(pow(2.4u, 2*km2))'
for k,v in scaling_factors.items():
ptrn=re.compile('\d('+k+')\D')
expr=ptrn.sub(v,expr)
print(expr)输出:
k1 + 4.3e3+ 3.6e6(pow(2.e-6 2*km2))发布于 2018-05-28 18:00:48
如果你有字符串形式的数字,你只需要替换:
for key in dictionary.iterkeys():
address.replace(key, dictionary[key])如果您有十进制值的数字
from decimal import Decimal
'%.2E' % Decimal('40800000000.00000000000000')
# returns '4.08E+10'https://stackoverflow.com/questions/50563691
复制相似问题