2012-12-06 28 views
0

我一直在使用正則表達式整天將解析複雜的字符串分解爲有意義的數據。我已經釘了幾乎所有東西,但我留下了最後一個問題:根據模式將一行分割爲多行

我正在解析表示計劃的字符串列表。每一天都是列表中的一個單獨項目。有些日子有一天有多個約會,像這條線:

星期二10/13/2011 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]。

預計產出將是:

週二10/13/2011 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 =移位([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到這一點,或者採取完全不同的路線。

+0

澄清 - #1上面的字符串是從文件中的所有一行,我承擔該函數將該函數作爲整行的單個字符串接收。 #2每一行的日期(開始預約)是一樣的? #3,因爲字符串中還有其他可能的國會大廈字母,僅僅使用它們來匹配我們的正則表達式是不夠的,您還可以給出哪些其他約束條件,至少2個字符?總是一個字?總是在約會之後和之前?回答這些問題我可以幫助你。 –

+0

#1上述字符串是來自100個項目列表中的一個項目(字符串) #2對於從該項目派生的所有行,日期是相同的 #3約束=連續5個或更多的國會大廈字母,因此[AZ] {5,} – Difusio

回答

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()) 
+0

太棒了,thanx很多! – Difusio