你可以做到这一切一举:
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}
所以,你不能再用一个或多个数字分割。你试图解决什么问题?你的字符串是字母数字吗? –
@Wiktor:Did。.. [r] [^ \ W \ d _] + | \ d +“''r”(\ d + | \ s +)“''”([A-Za-z])([0 -9] *)“'和其他一些,但只是无法得到正确的正则表达式。 看着答案,结果是更多的焦点会有所帮助;)即使如此,我也不可能把整个事情写下来!行:) – holmes840