Python - 使用正则表达式将数字和字母拆分为子字符串

3
我正在创建一个度量单位转换器。用户需要输入类似于125km的表达式(数字后面跟着单位缩写)。为了进行转换,必须从缩写中分离出数值,得到一个结果如[125, 'km']。我已经使用正则表达式re.split实现了这一点,但它会在结果列表中产生不需要的项。
import re
s = '125km'
print(re.split('(\d+)', s))

输出:

['', '125', 'km']

我不需要也不想要开头的''。如何使用正则表达式简单地将字符串中的数字部分与字母部分分离,以产生一个列表?


你会遇到类似于 kg*(m^2)/(s^2) 这样的东西吗? - nhahtdh
@nhahtdh 很可能不是。 - Jacob
@nhahtdh,肯定JNm就足够了 :-) - paxdiablo
@paxdiablo 抱歉,那些是什么? - Jacob
1
@paxdiablo:当然可以,但对于 m/s^2(加速度)来说并不简单。 - nhahtdh
1
@Jacob:能量的单位是J或者kg*(m^2)/(s^2),或者N*m。它也等同于W*h,用来衡量电能消耗(通常为kW*h,千瓦时)。 - nhahtdh
2个回答

12

re.findall 有什么问题吗?

>>> s = '125km'
>>> re.findall(r'[A-Za-z]+|\d+', s)
['125', 'km']

[A-Za-z]+ 匹配一个或多个字母。|\d+ 一个或多个数字。

或者

使用列表推导式。

>>> [i for i in re.split(r'([A-Za-z]+)', s) if i]
['125', 'km']
>>> [i for i in re.split(r'(\d+)', s) if i]
['125', 'km']

1
如果数字有小数点,有没有办法处理这种情况?比如说1.25公里,我该怎么得到['125', '公里']呢? - Kikanye
1
re.findall(r'[A-Za-z]+|\d+(?:\.\d+)?', s) - Avinash Raj

1
将字符串拆分为子字符串列表(数字和其他字符)
使用程序:
s = "125km1234string"
sub = []
char = ""
num = ""
for letter in s:
    if letter.isdigit():
        if char:
            sub.append(char)
            char = ""
        num += letter
    else:
        if num:
            sub.append(num)
            num = ""
        char += letter
sub.append(char) if char else sub.append(num)
print(sub)

输出

['125', 'km', '1234', 'string']

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接