1

我在这里的脚本应该以这种格式返回结果

[ {'heure':xxxx,'mid': xxxx,'type message': "e.g SMS.Message ", "Origine":xxx,"Destination":xxxx}] 

很好,但是没有 Type 消息,我刚刚添加了这个,所以我认为正则表达式不正确。:/ 当我添加一个没有看起来像正则表达式的数据的数据时,它也不起作用,所以我想我必须做一个try:-except:但我不知道怎么做。:/

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import re 
################################_Function EXTRACT_############################################### 

def extraire(data):
    ms = re.match(r'(\S+).*mid:(\d+).*(R:NVS:\w+)', data) # heure & mid 
    k = re.findall(r"/\S+", data ) # source & destination extracte 
    return {'Heure':ms.group(1), 'mid':ms.group(2),'Type Message':ms.group(3),"Origine":k[0],"Destination":k[1]}


#################################################################################################

tableau = []  
data3 = "12:07:32.546 mta         Messages       I Doc O:TCARVAL (NVS:SMTP/jack.reacher@example.de) R:NVS:VOICE/+45154245 mid:6500"
data4 = "12:07:41.391 mta         Messages       I Rep O:TCARVAL (NVS:SMTP/brad.alison@yow.en) R:NVS:**SMS.Message**/+39872422 mid:6500"
data5 = "12:07:32.546 mta         Messages       I Doc O:TCARVAL (NVS:VOICE/+69517412carval@ifremer.no) R:NVS:SMS.Message/+34659879 mid:6500"
data6 = "12:07:32.545 mta     Messages   I Doc O:TCARVAL Example@whitout-slash.com        R:NVS:VOICE/01020150405 mid:9797"
data_list = [ data3, data4,data5, data6]
tableau = [extraire(data) for data in data_list]
print tableau 
4

2 回答 2

1

将您的额外功能更改为此,因为ms即使没有匹配项,您也尝试访问属性。当没有匹配项时,ms是 None :

def extraire(data):
    ms = re.match(r'(\S+).*mid:(\d+).*(R:NVS:\w+)', data) # heure & mid                                 
    print(str(ms))
    if(ms is not None):
        k = re.findall(r"/\S+", data ) # source & destination extracte                                  
        return {'Heure':ms.group(1), 'mid':ms.group(2),'Type Message':ms.group(3),"Origine":k[0],"Desti\
nation":k[1]}
    else:
        return {}

顺便说一句,您的正则表达式似乎与您打算匹配的文本不匹配。k如果不包含您正在寻找的元素数量,您也可能会得到 List index out of range 错误 。

于 2013-04-18T09:31:31.113 回答
1

“mid”在“R:NVS”之后,所以你的模式有错误的顺序

12:07:32.546 mta         Messages       I Doc O:TCARVAL (NVS:SMTP/jack.reacher@example.de) R:NVS:VOICE/+45154245 mid:6500
                                                                                           1                     2

因此,您需要将模式中的顺序更改为这样的

(\S+).*(R:NVS:\w+).*mid:(\d+)

顺便提一句。你\S+期望匹配什么?在这里它将匹配字符串中的第一个非空白字符系列。

于 2013-04-18T09:31:56.227 回答