2013-03-18 100 views
1

我有一个列表,其中包含许多自己的列表条目。以下是一些主要列表中的子表:蟒蛇分裂列表列成原列表中的多列

>>> data[4] 
['', u'BNE JCT TR92 FLO GRJCT-PERRY-BITTERSWEET', u'BNE_JCT TR92 TR92 (XF/ALTW/*)', u'KARMA-PERRY-BITTERSWEET_161', u' 01', -15.88, ''] 
>>> data[5] 
['', u'CRETE-STJHN FLO DMNT-WLTN 765+SPS', u'ST_JOHN 34519 A (LN/NIPS/CE)', u'SPS WILTON-DUMONT+PWRTN 5+JOLIET 7', u' 01', -8.14, ''] 
>>> data[6] 
['', u'HRNR_TR_1_TR_1_XF', u'HRNR TR_1 TR_1 (XF/AMMO/*)', '', u' 01', 1.4, ''] 
>>> data[7] 
['', u'INDPDN INDPDBRYAN69_11 LN', u'INDPDN INDPDBRYAN69_1 1 (LN/ALTW/ALTW)', u'ACTUAL', u' 01', 1.26, ''] 
>>> 

我想在子表分割列3到4个组成部分如下:

  • 所有的第一个字符到最后一个字符串非空格字符
  • 字符串包封(/
  • //
  • 之间包封的字符串之间
  • 字符串包封/)之间

因此,我希望相同的列表,但与第3列分割为4列,如上所述。

例子:

['', u'BNE JCT TR92 FLO GRJCT-PERRY-BITTERSWEET', u'BNE_JCT TR92 TR92', u'XF',u'ALTW','*', u'KARMA-PERRY-BITTERSWEET_161', u' 01', -15.88, ''] 

我也不知道是什么元素之前的u代表。我一直在与re.split()搞混,但一直没有能够得到这个工作,保留了原来的列表,但将列表3分为4列。

我很感激帮助。

[I由编辑以除去ArrayList和与列表替换它]在前面**

+1

Python没有阵列列表,只是列表,前面的'u'表示unicode,允许字符串包含unicode字符,用于非python 3.0+版本(默认情况下,python 3.0+是unicode)。 – Serdalis 2013-03-18 21:55:50

回答

2

u代表的unicode,使字符串包含Unicode charactors,在非蟒3.0+版本中使用(蟒3.0+是系统默认的Unicode)

为您的分裂,你可以做以下分裂成你想要的列:

# search for parts you need in column 3 
for subitem in re.findall("(.*?) \((.*?)\)", item[2]): 
    temp_split = [subitem[0]] 
    temp_split.extend(subitem[1].split("/")) 

您不能在列表的中间添加列。
您可以创建一个新的列表,像这样:

for item_index in range(len(data)): 
    item = data[item_index] 

    for subitem in re.findall("(.*?) \((.*?)\)", item[2]): 
     # part before the () 
     temp_split = [subitem[0]] 
     # part in the () 
     temp_split.extend(subitem[1].split("/")) 

    temp_item = item[:2] 
    temp_item.extend(temp_split) 
    temp_item.extend(item[3:]) 

    data[item_index] = temp_item 
+0

我对你的解决方案做了一些改动(使用rstrip())。否则这个工作。非常感谢你。 – codingknob 2013-03-19 00:58:59

+0

@ algotr8der抱歉抱歉误解了你的第一个要点。 – Serdalis 2013-03-19 02:53:14

+0

@ algotr8der在这里你走了,我已经为你正确了。 – Serdalis 2013-03-19 03:39:34

0
import re 
data = ['', u'BNE JCT TR92 FLO GRJCT-PERRY-BITTERSWEET', u'BNE_JCT TR92 TR92 (XF/ALTW/*)', u'KARMA-PERRY-BITTERSWEET_161', u' 01', -15.88, ''] 
_data =[] 
tempStr = "" 
for i in data: 
    if re.match("(.+/.+/.+)", str(i)): 
     for char in i: 
      if (char != "(" and char != "/" and char != ")"): 
       tempStr += char 
      else: 
       _data.append(tempStr) 
       tempStr = "" 
    else: 
     _data.append(i) 
print _data 

这个脚本会给这个输出:

['', u'BNE JCT TR92 FLO GRJCT-PERRY-BITTERSWEET', u'BNE_JCT TR92 TR92 ', u'XF', u'ALTW', u'*', u'KARMA-PERRY-BITTERSWEET_161', u' 01', -15.88, ''] 
3

这里有一个正则表达式模式将匹配你想要的字符串的部分:

pattern = r"(.+) \((.+)/(.+)/(.+)\)" 

这可能是最简单的正则表达式,将做工作。

这里是你如何使用它:

import re 

for row in data: 
    row[2:3] = re.match(pattern, row[2]).groups() 

有对那里发生了很多。外层循环很容易理解。内部部件有两个部分部分:

  1. re.match(pattern, row[2]).groups()确实正则表达式匹配,并返回找到的值的元组(例如('BNE_JCT TR92 TR92', 'XF', 'ALTW', '*'))。
  2. 第二位是切片分配。 row[slice] = some_sequencesome_sequence的值替换指定的切片。如果序列中的值数量与切片中的数量不同,则列表将更改大小!在这种情况下,我们用从正则表达式匹配得到的四个值替换单值切片(从索引2开始,在索引3之前停止)。

请注意,如果正则表达式与任何行中的值不匹配,则此代码将引发异常。如果有可能你的数据会变得“杂乱”,你应该添加一些额外的逻辑来检测这个数据,而不是让它爆炸。

+0

我试图运行上面的代码,但得到... 回溯(最近通话最后一个): 文件“”,2号线,在 AttributeError的:“NoneType”对象有没有属性“组” – codingknob 2013-03-18 22:41:21

+0

@ algotr8der:是的,这是我在最后一段中提到的例外。 'data'中的某一行有一个与该模式不匹配的值。我不确定你想在这种情况下做什么,因为它表明你的数据在某种程度上是腐败的。可能有一个解决办法,但它可能需要找一些小手段。你可以拆分匹配和切片分配来找出错误的位置。 – Blckknght 2013-03-19 07:17:04