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 个附加列的工作。

我很感激帮助。

[我进行了编辑以删除 arraylist 并将其替换为 list]**

4

3 回答 3

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_sequence用 中的值替换指定的切片some_sequence。如果序列中的值数量与切片中的值不同,则列表将改变大小!在这种情况下,我们将一个单值切片(从索引 2 开始,在索引 3 之前停止)替换为从正则表达式匹配中获得的四个值。

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

于 2013-03-18T22:18:20.360 回答
2

前面u的代表 unicode,允许字符串包含 unicode 字符,用于非 python 3.0+ 版本(python 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
于 2013-03-18T22:17:10.623 回答
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, '']
于 2013-03-18T22:17:30.327 回答