我有一个列表,其中包含许多本身就是列表的条目。以下是主要列表中的一些子列表:
>>> 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并将其替换为列表] **
答案 0 :(得分:3)
这是一个正则表达式模式,它将匹配您想要的字符串部分:
pattern = r"(.+) \((.+)/(.+)/(.+)\)"
这可能是最简单的正则表达式。
以下是您使用它的方式:
import re
for row in data:
row[2:3] = re.match(pattern, row[2]).groups()
那里有很多事情要发生。外环很容易理解。内部部分有两个部分:
re.match(pattern, row[2]).groups()
执行正则表达式匹配,并返回找到的值的元组(例如('BNE_JCT TR92 TR92', 'XF', 'ALTW', '*')
)。row[slice] = some_sequence
使用some_sequence
中的值替换指定的切片。如果序列中的值不同于切片中的值,则列表将更改大小!在这种情况下,我们将使用从正则表达式匹配中获得的四个值替换单值切片(从索引2开始,在索引3之前停止)。请注意,如果正则表达式与任何行中的值不匹配,则此代码将引发异常。如果您的数据有可能“混乱”,您应该添加一些额外的逻辑来检测它,而不是让它爆炸。
答案 1 :(得分:2)
前面的u
代表unicode,允许字符串包含unicode charactors,在非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
答案 2 :(得分: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, '']