python - 将字符串拆分为字符和数字并存储在 map Python 中

标签 python regex string split numbers

我有一个像

这样的字符串

'A15B7C2'

表示字符的个数。

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

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)

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

最佳答案

您可以一次性完成所有这些:

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}

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

r"([A-Z][a-z]?)(\d+)?"

本质上,一个大写字母后面可能跟一个小写字母作为第一组,一个可能存在也可能不存在的数字作为第二组(这将返回 '' 如果它不存在。

一个棘手的例子:

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}

关于python - 将字符串拆分为字符和数字并存储在 map Python 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44683227/

相关文章:

python - 如何创建矩阵模板来检查句子相似度?

python - 正则表达式,其中模式的一部分是可选的。

regex - 匹配正则表达式并在单行代码中分配结果

c - scanf 和 printf 格式修饰符

C 程序在轨道数组中搜索轨道

c++ - 如何将 IF 语句与字符串用户输入一起使用?

python - 是否有任何适用于 Python3 的工作内存分析器

python - 在圆内寻找轮廓

Python 和 POST 数据

正则表达式忽略字符的前 6 个匹配项