给定一个字符串,Python中提取字符串中所有整数的最佳方法

时间:2016-06-05 13:40:12

标签: python regex text

给定一个未知格式的字符串,但希望包含已知数量的整数,我想将这些整数提取为List,如果整数的数量与预期的不匹配则返回错误。

例如,如果字符串显示为'This is a test 1 2 3 55',并且预期的整数数为4,则应返回[1, 2, 3, 55]

如果字符串读取'(1 2 3 55)',并且预期的整数数为6,则应返回错误。

在其他语言中,我会在所有空格或标点符号中分成单词,测试每个单词的数字状态,并抛弃未通过测试的单词,但我是Python的新手,我很好奇是否有更好的方法

3 个答案:

答案 0 :(得分:6)

您可以使用正则表达式 -

import re

s = 'This is a test 1 2 3 55'

expr = r'\d+'

print(list(map(int, re.findall(expr, s))))

如果您不想使用正则表达式,这也可以 -

s = 'This is a test 1 2 3 55'

arr = [int(x) for x in s.split() if x.isdigit()]

print(arr)

输出 -

[1, 2, 3, 55]

正如Michael Stern评论的那样,如果您的输入字符串包含floatsintstr的混合(如'55ab9')并且您想要忽略它们,那么第一种方法不行。您应该按空格拆分并将每个元素与正则表达式r'^\d+$'匹配。

答案 1 :(得分:1)

我会使用过滤器来获取整数。我们在splitted字符串中搜索整数(这是一个列表)。

In [55]: s = 'This is a test 1 2 3 55'
In [56]: list(filter(lambda x: x.isdigit(), s.split()))
Out[56]: ['1', '2', '3', '55']

答案 2 :(得分:0)

由于这非常简单,按空格分割比使用正则表达式要好。

以下是一个符合您要求的程序。如果将预期计数从4更改为任何其他数字,它将按指定的方式抛出错误。

 strdata='This is a test 1 2 3 55'
 num=[]
 expected_count=4
 for i in strdata.split():
    if i.isdigit():
            num.append(i)
 if len(num)==expected_count:
    print num
 else:
    raise ValueError('Numbers count not as expected')