在C语言中,在Python中,strtok()是如何工作的?

2024-09-29 00:18:47 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在学习Python,并试图找出一种有效的方法,将一个由逗号分隔的数字串标记成一个列表。格式良好的案例如我所料,但格式不太好的案例并不多。

如果我有这个:

A = '1,2,3,4'
B = [int(x) for x in A.split(',')]

B results in [1, 2, 3, 4]

这是我所期望的,但是如果字符串更像

A = '1,,2,3,4,'

如果我对B使用与上面相同的列表理解表达式,就会得到一个异常。我想我理解原因(因为有些“x”字符串值不是整数),但我认为有一种方法可以非常优雅地解析它,使字符串a的标记化工作得更直接一些,就像在C中迭代调用strtok(a,“,\n\t”)一样

为了明确我的要求;我在Python中寻找一种优雅/高效/典型的方式来拥有以下所有字符串示例:

A='1,,2,3,\n,4,\n'
A='1,2,3,4'
A=',1,2,3,4,\t\n'
A='\n\t,1,2,3,,4\n'

返回同一列表:

B=[1,2,3,4]

通过某种简洁的表达。


Tags: 方法字符串in标记列表for表达式格式
3条回答

这个怎么样:

A = '1, 2,,3,4  '
B = [int(x) for x in A.split(',') if x.strip()]

strip()修剪字符串中的空白,如果字符串都是空白,则将使其为空。在布尔上下文中,空字符串是“false”,因此它由列表理解的if部分过滤。

嗯,功能优度(加上一点生成器表达式):

a = "1,2,,3,4,"
print map(int, filter(None, (i.strip() for i in a.split(','))))

为了充分发挥功能:

import string
a = "1,2,,3,4,"
print map(int, filter(None, map(string.strip, a.split(','))))

一般来说,我尽量避免使用正则表达式,但是如果你想把它们分成很多不同的部分,它们就可以工作了。试试这个:

import re
result = [int(x) for x in filter(None, re.split('[,\n,\t]', A))]

相关问题 更多 >