0

私は一日中正規表現を使って複雑な文字列を意味のあるデータに解析してきました。私はほとんどすべてを釘付けにしましたが、この最後の問題が残っています:

スケジュールを表す文字列のリストを解析しています。毎日がリストの別のアイテムです。次のように、1日に複数の予定がある日もあります。

2011年10月13日火曜日SHIFT00:00-08:00予定の説明DAYOFF 08:00-17:30 08:00-12:30 12:30-13:00 13:00-17:30予定の説明NIGHT 17:30-24:00予約の説明

この文字列をシフトに基づいて3行に分割しますが、曜日と日付は維持します。すべてのシフトに共通しているのは、大文字の文字で構成されているため、[AZ]です。

期待される出力は次のようになります。

2011年10月13日火曜日SHIFT00 :00-08:00予定の説明
2011年10月13日火曜日DAYOFF 08:00-17:30 08:00-12:30 12:30-13:00 13:00-17 :30説明2011年10月13日
火曜日夜17:30-24:00予定の説明

考えられるすべてのシフトを単純にスキャンすることはできません。シフトは不明であるため、確実なのは、すべて大文字であるということだけです。したがって、正規表現を使用する必要があります。

私はこのような構造を考えました(regexmatch = a shift([AZ] {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を実装するのを手伝ってくれることを願っています。あるいは、まったく別のルートを取るかもしれません。

4

1 に答える 1

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())
于 2012-12-06T13:23:47.843 に答える