如何将字符串拆分为多个部分,并将值赋给原始字符串中数字前面的子字符串

2024-09-30 20:28:55 发布

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

我想将字符串分成几部分(分隔符是空格和/),并在每次浮点或int跟在字符串后面时为子字符串赋值:

例如,字符串可以是:

'ABC 12/5 a1 b-2.5 c34.5d54'

使用此选项,我希望输出为:

somelist=['ABC', '12', '5'],和 a=1, b=-2.5, c=34.5, d=54


Tags: 字符串a1选项int浮点空格abc赋值
1条回答
网友
1楼 · 发布于 2024-09-30 20:28:55

我提议这样做:

import re

s = 'ABC 12/5 a1 b-2.5 c34.5d54'
parts = re.findall('([a-z]+)(-?\d+(?:\.\d+)?)|([^ /]+)', s)
somelist = [rest for (key, value, rest) in parts if key == '']
vars = dict((key, float(value)) for (key, value, rest) in parts if key != '')

print(somelist)
print(vars)

输出:

['ABC', '12', '5']
{'c': 34.5, 'd': 54.0, 'a': 1.0, 'b': -2.5}

“变量”实际上是作为字典键输出的,我认为这更合适

说明

此正则表达式:

([a-z]+)(-?\d+(?:\.\d+)?)|([^ /]+)

会以某种方式匹配任何不是空格或斜杠的东西。首先,它尝试匹配|之前的部分:

([a-z]+)(-?\d+(?:\.\d+)?)

这将匹配后跟数字的任何字母序列。字母在第一组中(参见括号),数字部分在第二组中。该数字可以可选地具有减号(-?)和/或小数部分((?:\.\d+)?),其不在单独的组中捕获(因此?:

如果失败,则正则表达式的另一部分开始工作:

([^ /]+)

这会将下一个分隔符之前的任何内容捕获到第三个捕获组中

现在findall对其进行了一个很好的数组,每个部分都在每个子数组的相应索引处结束

两个列表理解分别处理两个不同的案例,并将结果收集在数组(匹配第三个捕获组)或dict(匹配前两个捕获组)中

相关问题 更多 >