2017-11-08 19 views
0

미리 도움을 청하십시오.Python의 Regex : 비슷한 에디션을 반복하여 텍스트에서 여러 줄 부분 추출

(A lot of information) 

time: 150 

C-FXY 

-- information --- 

E-END 

(A lot of information) 

time: 5000 

C-FXY 

**--- INFORMATION I WANT TO EXTRACT ---** 

E-END 

(A lot of information) 

time: 13000 

C-FXY 

-- information --- 

E-END 

(A lot of information) 

내가 그 I의 경우 5000에 해당하는 시간 단계에서 C-FXY 및 E-END 사이의 모든 것을 추출해야 : 나는 다음과 같은 레이아웃이 텍스트의 일부를 추출하는 파이썬 정규식을 사용하고 있습니다 다음 파이썬 3.6 문장을 사용하고 있습니다 : 불행하게도

time_step = '5000' 
text_part = re.search(r'time.*'+time_step+'.*C-FXY(.*?)E-END', text, re.DOTALL).group(1) 

내가 출력을 얻고 어떤 것은 그 C-FXY 및 E-END 사이 그러나 텍스트의 13000 시간 단계가 아니라 내가 원하는 것과 같은 판 시간대 : 5000.

도움이 될 것입니다. 고맙습니다. 당신의 정규식이 time 부분과 C-FXY 일 사이에 욕심.* 포함되어 있기 때문에 :)

답변

0

오류가 발생합니다. 그래서 그것은 모든 것을 마지막 그룹까지 먹는다.

여기 아닌 욕심 버전 사용하기에 충분해야한다 : 내가 여기에 전체 파일의 여러 검색을 사용하지,하지만 난 그냥까지 라인으로 파일 라인을 읽을 것, 어쨌든

text_part = re.search(r'time.*'+time_step+'.*?C-FXY(.*?)E-END', text, re.DOTALL).group(1) 

time: 5000을 입력 한 다음 C-FXY까지 저장하고 거기에서 아무 것도 저장하지 않고 C-END까지 저장하고 거기에서 처리를 끝내십시오.

+0

아직 잘 못하고 그것을위한 결과. 것은 내가 추출하고자하는 정보의 시작과 끝을 표시하기 만하면 PERL에서 사용되는 것과 유사한 정규 표현식을 사용하고자했습니다. 제안하는 두 번째 방법도 유효하지만 이에 대해 생각했습니다. Regex를 사용하여 sigle 문장으로 수행 할 가능성을 탐색하고 싶었습니다. – Coriolano

0

다음과 같은 코드를 사용하여 해결할 수 있습니다 : 인쇄하는 경우, 지금

import re 

text = """(A lot of information) 

time: 150 

C-FXY 

-- information --- 

E-END 

(A lot of information) 

time: 5000 

C-FXY 

**--- INFORMATION I WANT TO EXTRACT ---** 

E-END 

(A lot of information) 

time: 13000 

C-FXY 

-- information --- 

E-END 

(A lot of information)""" 

pattern = re.compile(r"C-FXY(.*?)E-END") 

results = re.findall(r"C-FXY(.*?)E-END", text, re.DOTALL) 

results :

for i, r in enumerate(results): 
    print(f"Resultado {i}:\n'{r}'") 

는 출력은 다음과 같습니다

Resultado 0: 
' 

-- information --- 

' 
Resultado 1: 
' 

**--- INFORMATION I WANT TO EXTRACT ---** 

' 
Resultado 2: 
' 

-- information --- 

'