给定一个未知格式的字符串,但希望包含已知数量的整数,我想将这些整数提取为List
,如果整数的数量与预期的不匹配则返回错误。
例如,如果字符串显示为'This is a test 1 2 3 55'
,并且预期的整数数为4
,则应返回[1, 2, 3, 55]
。
如果字符串读取'(1 2 3 55)'
,并且预期的整数数为6
,则应返回错误。
在其他语言中,我会在所有空格或标点符号中分成单词,测试每个单词的数字状态,并抛弃未通过测试的单词,但我是Python的新手,我很好奇是否有更好的方法
答案 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评论的那样,如果您的输入字符串包含floats
或int
和str
的混合(如'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')