2016-09-04 7 views
1

파이썬에서 regex를 사용하여 문자열에서 일치하는 문자열을 찾으려고합니다. string은 다음과 같습니다python regex 일치하는 문자열 찾기

band 1 # energy -53.15719532 # occ. 2.00000000 

ion  s  p  d tot 
    1 0.000 0.995 0.000 0.995 
    2 0.000 0.000 0.000 0.000 
tot 0.000 0.996 0.000 0.996 

band 2 # energy -53.15719532 # occ. 2.00000000 

ion  s  p  d tot 
    1 0.000 0.995 0.000 0.995 
    2 0.000 0.000 0.000 0.000 
tot 0.000 0.996 0.000 0.996 

band 3 # energy -53.15719532 # occ. 2.00000000 

내 목표는 tot 후 문자열을 찾는 것입니다. 여기

['0.000 0.996 0.000 0.996', 
'0.000 0.996 0.000 0.996'] 

내 현재 코드 :

pattern = re.compile(r'tot\s+(.*?)\n', re.DOTALL) 
pattern.findall(string) 

그러나, 출력이 날 제공 : 그래서 일치하는 문자열 뭔가처럼 될 것

['1 0.000 0.995 0.000 0.995', 
'0.000 0.996 0.000 0.996', 
'1 0.000 0.995 0.000 0.995', 
'0.000 0.996 0.000 0.996'] 

내가 뭐하는 거지의 어떤 생각 잘못된?

답변

4

DOTALL 플래그가 필요하지 않습니다. 그것을 제거하고 대신 MULTILINE을 사용하십시오.

pattern = re.compile(r'^\s*tot(.*)', re.MULTILINE) 

이 항목은 tot으로 시작하는 모든 줄과 일치합니다. 라인의 나머지는 documentation 강조 광산 인용 1.

그룹에있을 것입니다 : 이 줄 바꿈을 포함,

re.DOTALL

'.' 특수 문자가 전혀 문자와 일치 확인을 ; 이 플래그가 없으면 '.'은 개행을 제외한 모든 항목과 일치합니다.

정규식 없이도이 작업을 쉽게 수행 할 수 있습니다.

with open("input.txt", "r") as data_file: 
    for line in data_file: 
     items = filter(None, line.split(" ")) 
     if items[0] == "tot": 
      # etc 
+0

이 내 문제를 해결합니다. 나는 DOTALL과 MUTILINE에 대해 혼란 스럽다고 생각한다. 그것에 대해 더 많이 읽어야합니다. –

1

re.DOTALL을 사용하고 있습니다. 즉, 점 "." 다음 줄 바꿈 할 때까지 다음 "어린 아이"-s 모든 것을 모두 찾아 본질적으로 아무것도, 심지어 뉴 라인과 일치합니다 :

      tot 
    1 0.000 0.995 0.000 0.995 

및 re.DOTALL이 문제를 해결해야 제거

tot 0.000 0.996 0.000 0.996 

.

편집 : 실제로 DOTALL 플래그는 실제로는 문제가되지 않습니다 (불필요 함). 패턴의 문제점은 \ s +가 개행 문자와 일치한다는 것입니다. 하나의 공간이 교체하는 문제를 해결 :

pattern = re.compile(r'tot (.*?)\n') 
+0

@Tomalak이 –

+0

을 제안 할 때'DOTALL'을'MULTILINE'으로 변경해야한다고 생각합니다.^및 $를 사용하여 줄의 시작과 끝을 각각 일치시키지 않으려면 MULTILINE이 필요하지 않습니다. @ Tomalak의 솔루션이 더 깨끗하다는 것을 지적해야합니다. – mpurg

+0

당신 말이 맞아요. '\ s +'는 실제로 여기서 문제입니다. 나는 그것이 단지 하나 이상의 공백을 의미 할지라도. 알려 줘서 고마워. –

1

특정 정규식 패턴 re.findall 기능을 사용하여 대체 솔루션 :

# str is your inital string 
result = re.findall('tot [0-9 .]+(?=\n|$)', str) 
print(result) 

출력은 :

['tot 0.000 0.996 0.000 0.996', 'tot 0.000 0.996 0.000 0.996'] 
관련 문제