如何将字符串分成多个片段并将值分配给原始字符串中数字前面的子字符串

时间:2016-09-30 16:57:49

标签: python regex

我想将字符串分成多个部分(分隔符是空格和/),并在每次float或int跟在字符串后为子字符串赋值:

例如,字符串可以是:

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

使用这个,我希望输出为:

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

1 个答案:

答案 0 :(得分:1)

我建议这个脚本:

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(前两个匹配的位置)。