如何使用regex将字符串中的数字格式化为2.5k到2.5e3

2024-06-16 11:40:57 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在用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

但它不起作用


Tags: 文件sample字符串re表达式k1数学spice
3条回答

使用负先行((?<=...))确保符号前有一个数字,并使用单词边界断言(\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对象调用该函数,并将其返回值用作替换值。你知道吗

写得有点快,所以可能不完美,但像这样的东西?你知道吗

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))

我不确定是否有这样的图书馆。你知道吗

其中一条评论建议您可以使用结构更换,但您必须编写自己的循环如果条件,因为您只想在字母正确的位置替换它们。你知道吗

我知道这并不能马上给你答案,但它可以指引你走向正确的道路。你知道吗

相关问题 更多 >