将字符串拆分为字符和数字并存储在地图Python中

hol*_*840 2 python regex string split numbers

我有一个字符串

'A15B7C2'

它代表角色的数量.

我使用的现在把它分割成字符和数字.之后,最终将它存储在一个字典中

import re
data_str = 'A15B7C2'
re.split("(\d+)", data_str)
# prints --> ['A', '15', 'B', '7', 'C', '2', '']
Run Code Online (Sandbox Code Playgroud)

但是,如果我有一个字符串

'A15B7CD2Ef5'

这意味着C的计数为1(其隐含),Ef的计数为5.(大写和后续小写计数为一键)因此我得到

'CD'= 2(不正确)
'Ef'= 5(正确)

如何修改它以提供正确的计数?什么是最好的解析方法,并计算和存储在一个字典?

jua*_*aga 6

你可以一举做到这一切:

In [2]: s = 'A15B7CD2Ef5'

In [3]: {k: int(v) if v else 1 for k,v in re.findall(r"([A-Z][a-z]?)(\d+)?", s)}
Out[3]: {'A': 15, 'B': 7, 'C': 1, 'D': 2, 'Ef': 5}
Run Code Online (Sandbox Code Playgroud)

正则表达式本质上是对您的需求,利用.findall和捕获组的直接翻译:

r"([A-Z][a-z]?)(\d+)?"
Run Code Online (Sandbox Code Playgroud)

基本上,一个大写字母后面可能跟一个小写字母作为第一个组,一个数字可能会或可能不会作为第二个组(''如果它不在那里,它将返回.

一个棘手的例子:

In [7]: s = 'A15B7CD2EfFGHK5'

In [8]: {k: int(v) if v else 1 for k,v in re.findall(r"([A-Z][a-z]?)(\d+)?", s)}
Out[8]: {'A': 15, 'B': 7, 'C': 1, 'D': 2, 'Ef': 1, 'F': 1, 'G': 1, 'H': 1, 'K': 5}
Run Code Online (Sandbox Code Playgroud)

最后,用一个更棘手的例子来打破它:

In [10]: s = 'A15B7CD2EfFGgHHhK5'

In [11]: re.findall(r"([A-Z](?:[a-z])?)(\d+)?", s)
Out[11]:
[('A', '15'),
 ('B', '7'),
 ('C', ''),
 ('D', '2'),
 ('Ef', ''),
 ('F', ''),
 ('Gg', ''),
 ('H', ''),
 ('Hh', ''),
 ('K', '5')]

In [12]: {k: int(v) if v else 1 for k,v in re.findall(r"([A-Z][a-z]?)(\d+)?", s)}
Out[12]:
{'A': 15,
 'B': 7,
 'C': 1,
 'D': 2,
 'Ef': 1,
 'F': 1,
 'Gg': 1,
 'H': 1,
 'Hh': 1,
 'K': 5}
Run Code Online (Sandbox Code Playgroud)