在Python中使用正则表达式匹配多种可能性

时间:2017-01-09 08:26:45

标签: python regex

我正在尝试使用Python处理日志文件并提取每个条目的日期,时间和日志消息,并将其存储在dicts列表中。我为此目的使用了re.search()group()方法 问题是日期/时间采用各种格式,如。

dd/mm/yy, hh:mm AM - logs
dd/mm/yyyy, hh:mm a.m. - logs
dd/mm/yy HH:mm - logs

我的程序看起来像这样:

import re
infile=open('logfile.txt', 'r')
loglist=[]
logdict={}
for aline in infile.readlines():
    line=re.search(r'^(\d?\d/\d?\d/\d\d), (\d?\d:\d?\d \w\w) - (.*?)',aline)
    if line:
        logdict['date'] = line.group(1)
        logdict['time'] = line.group(2)
        logdict['logmsg'] = line.group(3)
        loglist.append(logdict)

但是,这只与上述第一种格式相匹配 我如何匹配其他格式并维护组?或者有更简单的方法吗?

3 个答案:

答案 0 :(得分:2)

您可以在模式后使用{m,n}表示重复mn之间。因此,请使用\d{1,2}表示1位或2位数字。您可以使用替换来指示多种可能性,例如\d{2}|\d{4} 2年或4位数年。

所以regexp可以是:

^(\d{1,2}/\d{1,2}/(?:\d{2}|\d{4})),? (\d{1,2}:\d{1,2}(?: [AaPp]\.?[Mm]\.?)?) - (.*)'

答案 1 :(得分:0)

我首先使用正则表达式提取数据,然后手动验证它。我不会将正则表达式用于两件事,验证和提取。

为了清楚起见,我还要为这些正则表达式指定名称,并确保每个正则表达式都返回一个原子,如时间或日期或am_pm,然后将它们串在一起形成句子。 注意:我没有为组分配名称,但我认为它可能但不确定如何

但是最后你可以获得你的date_time并对其进行拆分,例如date_time.split(" /"),它会返回你的日,月,年然后你可以验证或使用

[alertController addTextFieldWithConfigurationHandler:^(UITextField *textField) {
    textField.placeholder = @"Name";
}];

[alertController addAction:[UIAlertAction actionWithTitle:@"OK" style:UIAlertActionStyleDefault handler:^(UIAlertAction *action) {
    NSArray *textfields = alertController.textFields;
    UITextField *nameTextfield = textfields[0];
    self.textFieldString = nameTextfield.text;

    NSLog(@"self.textFieldString is: %@", self.textFieldString); // -> this returns a null value when the string length is > 11
    NSLog(@"nameTextfield.text is: %@", nameTextfield.text); // -> this returns the string even when the string length is > 11

}]];

答案 2 :(得分:-1)

将其拆分为“ - ”,然后按“,”或“

拆分