regex 将字符串转换为整数

kyvafyod  于 2023-02-10  发布在  其他
关注(0)|答案(4)|浏览(188)

我快疯了,我找不到正确的解决办法
我怎么解决这个问题呢?我有一个循环,我可以得到不同的类型,比如:

empty string
10
10K
2.3K
2.34K
2M
2.2M
2.23M

我需要把它们转换成数字:

0
10
10000
2300
2340
2000000
2200000
2230000
gxwragnw

gxwragnw1#

您的步骤应该是:

  • 检查字符串是否为空
  • 返回0
  • 检查字符串是否以K或M结尾
  • 如果是,则从末尾剥离该字符,并将其存储以供以后使用
  • 乘以适当的系数(K = 1000或M = 1000000)

这可以通过以下方式实现:

def convert(value):
    if value:
        # determine multiplier
        multiplier = 1
        if value.endswith('K'):
            multiplier = 1000
            value = value[0:len(value)-1] # strip multiplier character
        elif value.endswith('M'):
            multiplier = 1000000
            value = value[0:len(value)-1] # strip multiplier character

        # convert value to float, multiply, then convert the result to int
        return int(float(value) * multiplier)

    else:
        return 0

values = [
    '',
    '10',
    '10K',
    '2.3K',
    '2.34K',
    '2M',
    '2.2M',
    '2.23M',
]

# use a list comprehension to call the function on all values
numbers = [convert(value) for value in values]

print numbers

这应该会返回

[0, 10, 10000, 2300, 2340, 2000000, 2200000, 2230000]
uidvcgyl

uidvcgyl2#

获取浮点数的快速方法:

In [15]: powers = {'K': 10 ** 3, 'M': 10 ** 6}

In [16]: def f(s):
    ...:     try:
    ...:         if s[-1] in powers.keys():
    ...:            return float(s[:-1]) * powers[s[-1]]
    ...:         else:
    ...:            return float(s)
    ...:     except:
    ...:         return s
    ...:         

In [17]: map(f, ['', '10', '10K', '2.3K', '2.34K', '2M', '2.2M', '2.23M'])
Out[17]: ['', 10.0, 10000.0, 2300.0, 2340.0, 2000000.0, 2200000.0, 2230000.0]
vcirk6k6

vcirk6k63#

我同意其他答案,这个解决方案将是最好的解决它没有正则表达式。
但是,如果你仍然想使用regex,这里有一个很好的方法使用JavaScript(抱歉,不熟悉Python):

var new_arr = ['','10','10K','2.3K','2.34K','2M','2.2M','2.23M'].map(function(value) {
    return value.replace(/^(\d*(?:\.\d+)?)([kgm]?)$/i, function(_, number, group) {
        return !group && (number||'0') || parseFloat(number) * Math.pow(10, {'k':3,'m':6,'g':9}[group.toLowerCase()]);
    });
});

如果有人能把它翻译成Python,那就最好了(而且它会很好地教我一点Python)。:))

zzwlnbp8

zzwlnbp84#

import re

def transform_value(value):
    match = re.match(r'^(\d*(?:\.\d+)?)([kgm]?)$', value, re.IGNORECASE)
    if match:
        number = match.group(1) or '0'
        group = match.group(2).lower()
        if group:
            return int(float(number) * 10**{'k': 3, 'm': 6, 'g': 9}[group])
        return int(number)
    return 0

new_arr = [transform_value(value) for value in 
['','10','10K','2.3K','2.34K','2M','2.2M','2.23M']]

print(new_arr)

输出

[0, 10, 10000, 2300, 2340, 2000000, 2200000, 2230000]

相关问题