4

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"]
4

5 回答 5

8

查找一个或多个相邻数字 ( \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']
于 2012-11-19T16:18:46.420 回答
1

其他解决方案肯定更容易。如果你想要一些不那么简单的东西,你可以尝试这样的事情:

>>> 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']
于 2012-11-19T16:24:03.003 回答
1

你可以这样做:

>>> [el for el in re.split('(\d+)', string) if el.strip()]
['123', 'ab', '4', '5']
于 2012-11-19T16:25:01.910 回答
0

你可以在这里做一些事情,你可以

1. 迭代列表并随时制作数字组,将它们附加到您的结果列表中。

不是一个很好的解决方案。

2.使用正则表达式。

实施2:

>>> import re
>>> s = "123ab4 5"
>>> re.findall('\d+|[^\d]', s)
['123', 'a', 'b', '4', ' ', '5']

您想抓取至少有 1 个数字\d+或任何其他字符的任何组。

编辑

约翰首先让我找到了正确的解决方案。这是一个绝妙的解决方案

不过,我将把它留在这里,因为其他人可能会误解这个问题并寻找我认为写的内容的答案。我的印象是 OP 只想捕获一组数字,而让其他一切都保持独立。

于 2012-11-19T16:22:59.557 回答
0

这将给出您想要的拆分:

re.findall(r'\d+|[a-zA-Z]+', "123ab4 5")

['123', 'ab', '4', '5']
于 2012-11-19T16:25:23.047 回答