使用python将字符串和整数(w / sets)从字符串解析为列表

时间:2012-02-28 00:16:00

标签: python parsing

我想要一个看起来像这样的字符串:'Oreo.12.37-40.Apple.78'并将其变成一个如下所示的列表:

['Oreo', 12, 37, 38, 39, 40, 'Apple', 78]

' - '导致值之间的迭代。 ('37 -40'变为[37,38,39,40])

https://stackoverflow.com/a/5705014/1099935 有一个非常好的解决方案,但我不太了解它如何合并字符串处理。 (它仅适用于数字,但在int()中使用字符串失败

注释为我锁定(?),所以这里有一个额外的注释:我需要列表包含int值或字符串。然后在过滤器项目中使用Q对象可以按通用名称或指定的产品密钥进行过滤(通常很短,也常用)

2 个答案:

答案 0 :(得分:1)

这是一个选项:

def custom_split(s):
    def int_range_expand(s):
        try:
            return [int(s)]
        except ValueError:
            try:
                start, end = map(int, s.split('-'))
                return range(start, end+1)
            except Exception:
                pass
        return [s]
    return sum(map(int_range_expand, s.split('.')), [])

>>> custom_split('Oreo.12.37-40.Apple.78')
['Oreo', 12, 37, 38, 39, 40, 'Apple', 78]

这使用EAFP方法,步骤细分如下:

1. custom_split('Oreo.12.37-40.Apple.78')
2. s <= 'Oreo.12.37-40.Apple.78'
3. s.split('.') => ['Oreo', '12', '37-40', 'Apple', '78']
4. map(int_range_expand, ['Oreo', '12', '37-40', 'Apple', '78'])
       => [['Oreo'], [12], [37, 38, 39, 40], ['Apple'], [78]]
5. sum([['Oreo'], [12], [37, 38, 39, 40], ['Apple'], [78]], [])
       => ['Oreo', 12, 37, 38, 39, 40, 'Apple', 78]

步骤4中的int_range_expand()功能始终返回一个列表。如果参数是字符串或int,则结果只有一个元素,但如果它是37-40之类的范围,那么它将包含该范围内的每个整数。这使我们可以轻松地将所有结果列表链接到一个列表中。

第5步类似于itertools.chain,效率更高但需要导入模块,最好是你。

答案 1 :(得分:1)

这样做:

#!/usr/bin/python

import re

s = 'Oreo.12.37-40.Apple.78'
l=[]
for e in re.split('[^\w-]+',s):
    m=re.match('(\d+)-(\d+)',e)
    if m:
       x=int(m.group(1))
       y=int(m.group(2))
       for i in range(x,y+1):
          l.append(i)   
    else:       
       try:
          l.append(int(e))
       except ValueError:
          l.append(e)

print l  

输出:

['Oreo', 12, 37, 38, 39, 40, 'Apple', 78]