2012-10-01 2 views
0

내 파일의 구조가 달라질 수 있으며이 정규 표현식이 내 변경 사항으로 인해 가끔씩 만 작동한다는 것을 발견했습니다. 내 정규식은
v6 = re.findall(r'(?s)----------\s*LOW VOLTAGE SUMMARY BY AREA.*?\rACTIVITY.+?',wholefile)다른 상황에서 정규 표현식을 수정해야합니다.

입니다. 현재이 파일의 다음 섹션과 일치합니다.

----------   LOW VOLTAGE SUMMARY BY AREA   ---------- 

    BUS NAME BASKV VOLT TIME  AREA  ZONE 

    12006 [AMISTAD 69.0] 0.971 1.8700 10 NEW MEXICO 121 
    11223 [WHITESA213.8] 0.918 1.9900 11 EL PASO  110 
    70044 [B.HYDROB4.16] 0.955 2.3233 70 PSCOLORADO 703 
    70044 [B.HYDROB4.16] 0.955 2.3233 70 PSCOLORADO 703 
    79086 [PAGOSA 115] 0.937 2.0333 73 WAPA R.M.  791 

내 정규식은 어떻게 반환 할 수 있습니다 : 파일의 해당 섹션 때로는 두 차례에

----------   LOW VOLTAGE SUMMARY BY AREA   ---------- 

     BUS NAME BASKV VOLT TIME  AREA  ZONE 

     12006 [AMISTAD 69.0] 0.742 13.2060 10 NEW MEXICO 121 
     11223 [WHITESA213.8] 0.916 1.8367 11 EL PASO  110 
     70187 [FTGARLND69.0] 0.936 19.6099 70 PSCOLORADO 710 
     73216 [WINDRIVR 115] 0.858 3.6100 73 WAPA R.M.  750 

(VFSCAN) AT TIME = 20.0000 UP TO 100 BUSES WITH LOW FREQUENCY BELOW 59.600: 

X ----- BUS ------ X FREQ  X ----- BUS ------ X FREQ 
12063 [ROSEBUD 13.8] 59.506  

다음과 같습니다 그러나

----------   LOW VOLTAGE SUMMARY BY AREA   ---------- 

     BUS NAME BASKV VOLT TIME  AREA  ZONE 

     12006 [AMISTAD 69.0] 0.971 1.8700 10 NEW MEXICO 121 
     11223 [WHITESA213.8] 0.918 1.9900 11 EL PASO  110 
     70044 [B.HYDROB4.16] 0.955 2.3233 70 PSCOLORADO 703 
     70044 [B.HYDROB4.16] 0.955 2.3233 70 PSCOLORADO 703 
     79086 [PAGOSA 115] 0.937 2.0333 73 WAPA R.M.  791 

ACTIVITY? 
PDEV 

ENTER OUTPUT DEVICE CODE: 
0 FOR NO OUTPUT 
1 FOR PROGRESS WINDOW 

나는 아래의 단지 부분은 캡처 싶습니다 내가 찾고있는 파일의 버전에 상관없이 위의 섹션?

답변

1

v6 = re.findall(r'(?s)----------\s*LOW VOLTAGE SUMMARY BY AREA.*?\r(ACTIVITY|\(VFSCAN\)).+?',wholefile) 
+0

감사합니다. 나는 이것을 시도하고 알릴 것이다. – user1642486

+0

나는 이것을 시도하고있다. 그러나 나는 나의 원래 정규식이 내가 원하는 것보다 더 많이주고있는 것으로 보인다. 그러나 나는 지금까지 그것을 알아 차리지 못했다. 이전에 파일의 끝 부분에있는 모든 것을 잡는 것이 었습니다.이 파일은 파일 끝에 도달했기 때문에 작동하지 않는다는 것을 알지 못했습니다. 내가 뭘 잘못하고 있는지 말해 줄 수 있니? – user1642486

+0

아마도 문제는 마지막 부분 인 것 같습니다 :'. +?'파일의 끝 부분과 일치합니다. 시도해 볼 수 있습니다 :'v6 = re.findall (r '(? s) ---------- \ s * 영역 별 저전압 요약 *? \ r (ACTIVITY | \ (VFSCAN \)) . *? [:?] ', 전체 파일)' – rbernabe

1

내가 정규식을 사용하는 것이 좋습니다 않을 것이다 작동하지만 대신에 몇 가지 분석을 수행해야합니다. 데이터가 data이라는 문자열에 있다고 가정 해 보겠습니다.

lines = [line for line in data.split("\n")] 

# find start of header 
for index, line in enumerate(lines): 
    if "LOW VOLTAGE SUMMARY BY AREA" in line: 
     start_index = index 
     break 

# first first data entry (line starting with whitespace and then a number) 
for index, line in enumerate(lines[start_index:]): 
    if line.strip() and line.split()[0].isdigit(): 
     first_entry_index = start_index + index 
     break 

# find last data entry (line starting with whitespace and then a number) 
for index, line in enumerate(lines[first_entry_index:]): 
    # we don't do this inside the if because it's possible 
    # to end the data with only entries and whitespace 
    end_entry_index = first_entry_index + index 

    if line.strip() and not line.split()[0].isdigit(): 
     break 

# print all lines between header and last data entry 
print("\n".join(lines[start_index:end_entry_index])) 
+0

나는이 대답을 정말로 좋아하지만, 나는 그것이 현재의 방법과 관련하여 얼마나 느리거나 얼마나 빠르는지보기 위해 노력해야 할 것이다. 정규식과 구문 분석을 모두 사용하여 결국 수 있습니다. 제 질문에 답변 해 주셔서 감사합니다. 정말 감사합니다! – user1642486

+0

인쇄하는 대신 numbert가있는 줄을 어떻게 작업 할 수있는 목록에 넣을 수 있습니까? 헤더 정보는 관심있는 섹션을 식별하기위한 것입니다. 나는 단지 숫자로 시작하는 라인을 원한다. 이 파일은 80MB 크기 일 수 있습니다. – user1642486

+0

@ user1642486 :'lines [start_index : end_entry_index]'는 당신이 묘사 한 것과 정확히 같습니다. – orlp

관련 문제