2012-12-06 2 views
0

저는 하루 종일 regex를 사용하여 복잡한 문자열을 의미있는 데이터로 구문 분석했습니다. 나는 거의 모든 것을 못 견뎌 왔지만이 마지막 문제로 남았습니다.패턴을 기반으로 한 줄을 여러 줄로 나누십시오.

일정을 나타내는 문자열 목록을 파싱 중입니다. 매일 매일 목록에 별도의 항목이 있습니다. 어떤 날에는 다음과 같이 하루에 여러 개의 약속이 있습니다.

화요일 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 약속에 대한 설명 NIGHT 17 : 30-24 : 00 약속에 대한 설명

이 문자열을 교대로 3 줄로 나누고 싶지만 그날을 유지하고 싶습니다. 날짜. 모든 교대는 공통적으로 대문자로 된 글자로 구성되므로 [A-Z]입니다.

예상 출력은 다음과 같습니다

화요일 2011년 10월 13일 SHIFT 00 : 00-08 : 약속의 00 설명
화요일 2011년 10월 13일 DAYOFF 08 : 00 ~ 17 : 30 08 : 00 ~ 12시 반 12 : 30 ~ 13 : 00 13 : 00 ~ 17 : 30 설명
화요일 2011년 10월 13일 밤 17 : 30-24 : 단순히 가능한 모든 검사 할 수없는 약속

의 00 설명 그들이 알지 못하기 때문에, 유일한 것은 그들이 모두 대문자에 있다는 것입니다. 따라서 정규 표현식을 사용해야합니다. ,

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을 구현하는 데 도움이 감각과 사람을 만드는 희망 :

나는 (REGEXMATCH이 변화 ([AZ] {5,}) =)과 같은 구조의 생각 또는 완전히 다른 경로를 택할 수도 있습니다.

내가 에 코드 (반복적으로 대신 목록에 추가) 약속 생성 구성 할 것
+0

- # 1 위의 문자열은 내가 가정, 파일에서 모두 한 줄입니다 함수에 의해 전체 행에 대한 단일 문자열로 수신됩니다. # 2 날짜 (약속 시작)는 각 라인마다 동일합니까? # 3 문자열에 다른 가능한 국회 의사당 문자가 있기 때문에 우리 정규식과 일치시키기 위해 사용하는 것만으로는 충분하지 않습니다. 다른 제약 조건은 무엇입니까? 2 문자 이상? 항상 한 마디? 항상 데이트를하고 시간을 보내기 전에? 나는 당신을 도울 수있는이 질문에 대답한다. –

+0

# 1 위의 문자열은 100 개 항목의 목록에서 하나의 항목 (문자열)입니다. # 2이 항목에서 모든 행에 대해 동일한 날짜가 지정됩니다. # 3 Constraint = 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

그레이트, 많이 고맙다! – Difusio

관련 문제