2016-10-25 9 views
0

...어설 션 뒤에 파이썬 정규식 부정적인 표정, 후속 캡처 된 그룹 시작 및 끝 인덱스가 올바르지 않습니까? 이 내 머리를 긁적있다

다음 코드는 파이썬 2.7에서 문제를 보여

import re 

test_string = "wqdwc ww w w\nwcw w wef wefwe fq\nWrite {\ndfwdfwdc\ndfdfwdf wef we\nwefwe wefwe ewf\nwefdww {{ wefwe, wefwe, wef, } \n}\nwqef wefwef qw\n}\nwef qw qfg3g q g\ng332r256\n32e5\n" 

node_descr_re = re.compile('\n([A-Z]\w+\d*)\s\{.+?(?<!)\n(\})', re.DOTALL) 

node_descr_match = node_descr_re.search(test_string) 

node_block = node_descr_match.group() 

print("---------------------------") 
print("Matched string: \n{}".format(node_block)) 
print("---------------------------") 
print("Node block length: {}".format(len(node_block))) 
print("group(2) start index: {}".format(node_descr_match.start(2))) 
print("group(2) end index: {}".format(node_descr_match.end(2))) 
print("group(2) capture: {}".format(node_descr_match.group(2))) 

나는 이것을 실행하고 얻을 :

--------------------------- 
Matched string: 

Write { 
dfwdfwdc 
dfdfwdf wef we 
wefwe wefwe ewf 
wefdww {{ wefwe, wefwe, wef, } 
} 
wqef wefwef qw 
} 
--------------------------- 
Node block length: 99 
group(2) start index: 129 
group(2) end index: 130 
group(2) capture: } 

정규식 정확하게 일치를 노드 설명을 횡설수설하는 사이에 넣고, 어설 션 뒤에 부정적인 모양을 올바르게 적용하고, \ n의 발생을 무시하고 그 앞에 공백이있는 중괄호를 닫지 만 후속 \ n 및 중괄호를 닫으면 그쪽을 점유합니다 그들 앞에는 공간이 없다.

출력 내용은 무엇이 문제인지 설명해야합니다. 그들은 그룹 (2)이 노드 설명의 닫는 중괄호를 성공적으로 포착했음을 보여줍니다. 그러나 노드 설명의 전체 길이 (노드 블록)는 98 자이지만 캡처 된 마지막 문자의 시작 색인 (그룹 (2)에 포착 된 닫는 중괄호)은 128입니다.

누구나 밝힐 수 있습니까?

EDIT - 원래 test_string에서 일치하는 위치를 나타내는 인덱스입니까? 그 대답을하는 것 같습니다. 질문 죄송합니다 - 가끔 닫는 중괄호를 보여줍니다

답변

0
>>> test_string[129:] 
'}\nwef qw qfg3g q g\ng332r256\n32e5\n' 

사실 지수 129에 나타나지 않습니다 오히려 경기 자체보다는 원래 문자열 내의 위치를 ​​참조 그룹의 시작과 끝 인덱스에 대한 혼란 = node_descr_match.start(2). node_block 자체는 인덱스 0에서 시작하지 않습니다. 이 31에서 시작한다 :

>>> test_string.index("\nWrite") 
31 

node_block전체 일치하므로 = test_string[31 : 130]test_string[31 : 31+99] 걸쳐. 닫는 중괄호는 마지막 문자이므로이보기에서도 인덱스는 130-1 = 129이어야합니다.

여기서 볼 수있는 불일치가 없습니다.

+0

감사의 말 Tim은 종종 그랬듯이 색인은 매치 자체가 아닌 원래 매치 된 문자열을 참조하기 시작했습니다. 나는 이것을 기억하기 위해 종종 두 번 생각해야합니다 - 이번에는 그 이상이 걸렸습니다! –