在Python中如何拆分字符串并获取数字?

11
我有一个字符串,如"GoTo: 7018 6453 12654\n",我只想得到类似这样的数字['7018', '6453', '12654'],我尝试过正则表达式但是无法将字符串分割并仅获取数字,以下是我的代码:
splitter = re.compile(r'\D');
match1 = splitter.split("GoTo: 7018 6453 12654\n")

my output is: ['', '', '', '', '', '', '', '', '7018', '6453', '12654', '']

示例2:

splitter = re.compile(r'\W');
match1 = splitter.split("GoTo: 7018 6453 12654\n")

my output is: ['GoTo', '', '7018', '6453', '12654', '']
5个回答

15

如果你所有的数字都是正整数,那么你可以使用 isdigit() 方法来完成这个任务,而不需要使用正则表达式:

>>> text = "GoTo: 7018 6453 12654\n"
>>> [token for token in text.split() if token.isdigit()]
['7018', '6453', '12654']

2
如果需要,可以轻松地在其中添加int(item) - plundra
做了一些 timeit 测试... 如果 split+isdigit 是基准值(它是最快的),那么编译后的 re.findall 比其慢 1.5 倍,未编译的 re.findall 则慢 2.5 倍。 - plundra
1
只有在分隔符是纯空格的情况下才有效(例如,即使是“1, 2, 3”也会破坏它)。 - 6502
2
@6502,没错,但是如果分隔符不是纯空格,你可以在split()的第一个参数中指定分隔符。 - Frédéric Hamidi
虽然我在 XML 方面有些同意这种说法,但我个人从未对 regexp 产生过这样的感觉,尽管我经常使用它们(包括编写 regexp 引擎)。速度方面相当薄弱,甚至在那个 re-antiboy 在授予不使用 regexp 的点数后也得到了证明。我看到有人(原帖作者)因为一些愚蠢的原因(他只是使用 split 而不是 findall)而放弃了正确的解决方案(re),并且可能会因为 stack overflow 而放弃学习 regexps。我对此感到有点难过... - 6502
显示剩余2条评论

7
>>> re.findall(r'\d+', 'GoTo: 7018 6453 12654\n')
['7018', '6453', '12654']

4
>>> import re
>>> re.findall("[0-9]+", "GoTo: 7018 6453 12654\n")
['7018', '6453', '12654']
>>> 

2
您可以在样例1中按照您当前的方法,并使用以下代码:

您可以在样例1中按照您当前的方法,并使用以下代码:

filter (lambda a: a != '', match1)

1

试试这个:

import re
splitter = re.compile(r'\d+')
match1 = splitter.findall("GoTo: 7018 6453 12654\n")
print match1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接