For example, I have:
string = "123ab4 5"
I want to be able to get the following list:
["123","ab","4","5"]
rather than list(string) giving me:
["1","2","3","a","b","4"," ","5"]
查找一个或多个相邻数字 ( \d+
),或者如果查找失败,则查找非数字、非空格字符 ( [^\d\s]+
)。
>>> string = '123ab4 5'
>>> import re
>>> re.findall('\d+|[^\d\s]+', string)
['123', 'ab', '4', '5']
如果您不想将字母连接在一起,请尝试以下操作:
>>> re.findall('\d+|\S', string)
['123', 'a', 'b', '4', '5']
其他解决方案肯定更容易。如果你想要一些不那么简单的东西,你可以尝试这样的事情:
>>> import string
>>> from itertools import groupby
>>> s = "123ab4 5"
>>> result = [''.join(list(v)) for _, v in groupby(s, key=lambda x: x.isdigit())]
>>> result = [x for x in result if x not in string.whitespace]
>>> result
['123', 'ab', '4', '5']
你可以这样做:
>>> [el for el in re.split('(\d+)', string) if el.strip()]
['123', 'ab', '4', '5']
你可以在这里做一些事情,你可以
1. 迭代列表并随时制作数字组,将它们附加到您的结果列表中。
不是一个很好的解决方案。
2.使用正则表达式。
实施2:
>>> import re
>>> s = "123ab4 5"
>>> re.findall('\d+|[^\d]', s)
['123', 'a', 'b', '4', ' ', '5']
您想抓取至少有 1 个数字\d+
或任何其他字符的任何组。
编辑
不过,我将把它留在这里,因为其他人可能会误解这个问题并寻找我认为写的内容的答案。我的印象是 OP 只想捕获一组数字,而让其他一切都保持独立。
这将给出您想要的拆分:
re.findall(r'\d+|[a-zA-Z]+', "123ab4 5")
['123', 'ab', '4', '5']