我想将字符串分成多个部分(分隔符是空格和/
),并在每次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
答案 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(前两个匹配的位置)。