2016-03-10 17 views
-1

我想要搜索文本中提取一些数据,我需要的时候我觉得没有什么需要处理的话:处理异常,同时遍历一本字典

items = {'item_1':['----']*len(some_text), 
     'item_2':['----']*len(some_text), 
     'item_3':['----']*len(some_text)] 

for i, data in enumerate(some_text): 
    try: 
     items['item_1'][i] = re.findall('regex_1',data)[0] 
    except (IndexError): 
     pass 
    try: 
     items['item_2'][i] = re.findall('regex_2',data)[0] 
    except (IndexError): 
     pass 
    try: 
     items['item_3'][i] = re.findall('regex_2',data)[0] 
    except (IndexError): 
     pass 

我做它的方式,而不是这个:

for i, data in enumerate(some_text): 
    try: 
     items['item_1'][i] = re.findall('regex_1',data)[0] 
     items['item_2'][i] = re.findall('regex_2',data)[0] 
     items['item_3'][i] = re.findall('regex_2',data)[0] 
    except (IndexError): 
     pass 

因为在最后一种情况下,如果只有一个搜索失败,我将丢失所有数据,但是我重复了很多代码。

编辑。

我的预期结果是与大多数项目有一个冠军。

例如,如果:

ITEM_1是一个地址
ITEM_2是出了名
ITEM_3是calification

如果和发生异常而搜索地址,我仍然希望能够得到名字和冥想。我也不想处理这个异常,所以我可以在需要时输入“未找到”的消息

+0

为什么没有'regex_3'? –

+0

如果任何搜索失败,您不希望它失败吗?或者您是否有理由仍然捕获您可以捕获的任何数据? – Trey50Daniel

+0

那么你的问题首先是什么?如果任何一个搜索失败,可能你应该解释一下预期的结果应该是什么样子,因为在任何一个版本的代码中,相应的列表不会被追加到下一个迭代中,并且会产生一个“IndexError”。 –

回答

1

我认为避免重复您的代码的方法是使用循环。首先,将您的字典键和正则表达式组合成可迭代的对象,然后遍历这些对。下面是可能看起来像使用字典键和正则表达式(但2元组的列表会工作也没关系):

key_regex_dict = {'item_1': 'regex_1', 'item_2': 'regex_2', 'item_3': 'regex_3'} 
for i, data in enumerate(some_text): 
    for key, regex in key_regex_dict.items(): 
     try: 
      items[key][i] = re.findall(regex, data)[0] 
     except IndexError: 
      pass