根据模式将一行拆分为多行

时间:2012-12-06 12:14:45

标签: python regex text-parsing

我整天都在使用正则表达式来将一个复杂的字符串解析为有意义的数据。我已经把几乎所有的东西钉了下来,但我还是留下了最后一个问题:

我正在解析表示计划的字符串列表。每天都是列表中的单独项目。有些日子在一天有多个约会,如下一行:

2011年10月13日星期二SHIFT 00:00-08:00预约说明DAYOFF 08:00-17:30 08:00-12:30 12:30-13:00 13:00-17:30预约夜晚17:30-24:00预约说明

我希望这个字符串根据班次分成三行,但同时保持日期和日期。所有变化的共同之处在于它们由大写字母组成,因此[A-Z]。

预期输出为:

2011年10月13日星期二SHIFT 00:00-08:00预约说明
星期二10/13/2011 DAYOFF 08:00-17:30 08:00-12:30 12:30-13:00 13:00-17:30描述
星期二10/13/2011夜晚17:30-24:00约会说明

我不能简单地扫描所有可能的转变,因为它们是未知的,唯一可以确定的是它们全部都是大写的。因此我需要使用正则表达式。

我想到了这样的结构(regexmatch = a shift([A-Z] {5,})):

placeholder = []
for day in schedule:
    newLine = []
    if day.count(regexmatch) > 1:
        newline.append(day[:2])       #To include day and date
        i = 2
        for i < len(day):
            if day[i] == regexmatch:
                placeholder.append(newLine)
                newLine = []
                newLine.append(day[:2])
                newLine.append(day[i])
            else:
                newLine.append(day[i])
        i += 1
    placeholder.append(newLine)

我希望这是有道理的,有人可以帮我实现regexmatch,或者采取完全不同的路线。

1 个答案:

答案 0 :(得分:1)

我会将代码组织到生成约会(而不是重复附加到列表中):

import re
day_re = re.compile(r'((?:Mon|Tues|Wednes|Thurs|Fri|Sat|Sun)day \d{2}/\d{2}/\d{4}) (.*)')
shift_re = re.compile(r'([A-Z]{5,} [^A-Z]*(?:[A-Z]{1,4}[^A-Z]+)*)')

def appointments(lines):
    """
    Given iterator `lines` containing one or more appointments per day,
    generate individual appointments.
    """
    for line in lines:
        day, remainder = day_re.match(line).groups()
        shifts = shift_re.findall(remainder)
        if shifts:
            for shift in shifts:
                yield '{} {}'.format(day, shift.strip())
        else:
            yield '{} {}'.format(day, remainder.strip())