你可以做到這一切一舉:
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