将字符串拆分为字符和数字并存储在映射Python中

2024-09-30 16:24:30 发布

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

我有一根绳子

'A15B7C2'

它表示字符的计数。在

我现在正在使用re将其拆分为字符和数字。在那之后,它最终会存储在dict中

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

但是如果我有一根像

'A15B7CD2Ef5'

这意味着C的计数是1(它的隐式),Ef的计数是5。(大写和随后的小写作为一个键计算)因此我得到

'CD' = 2 (Not correct)
'Ef' = 5 (Correct)

如何修改它以提供正确的计数? 在dict中解析、获取计数和存储的最佳方法是什么?在


Tags: importredata数字字符printsdict计数
3条回答

搜索字符串中的字母,而不是数字。在

import re
data_str = 'A15B7C2'
temp = re.split("([A-Za-z])", data_str)[1:]    # First element is just "", don want that
temp= [a if a != "" else "1" for a in temp]    # add the 1's that were implicit in the original string
finalDict = dict(zip(temp[0::2], temp[1::2]))  # turn the list into a dict

您可以使用一些regex逻辑和^{}

([A-Z])[a-z]*(\d+)

a demo on regex101.com


Python中,这将是: ^{pr2}$

你可以一下子做到:

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}

regex实际上是您的需求的直接翻译,利用.findall和捕获组:

^{pr2}$

{2后面可能不是一个大写字母,也可能不是一个小写字母。在

一个更棘手的例子:

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}

最后,用一个更棘手的例子来说明:

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}

相关问题 更多 >