2016-12-23 1 views
-1

는이 같은 파이썬 정규식이DOTALL이있는 정규식, 어떤 시점에서 멈추게하는 방법? 나는이 같은 패턴에 <code>re.findall</code>을하려고</p> <pre><code>re.compile(r'([chartsjs].*[/chartsjs])', re.DOTALL) </code></pre> <p>:

[charts] 
name: mychart 
type: line 
labels: fish, cat, dog 
data: 4, 5, 6 
data2:5, 7, 9 
[/charts] 

this is some text 

[charts] 
name: second 
type: line 
labels: 100, 500, 1000 
data: 50, 100, 10000 
data2: 100, 100, 100 
[/charts] 

하지만 맨 마지막에 처음 [charts] 일치하는 것처럼 보인다 [charts] 중간에 모든 것을 잡아, 내가 콘솔에 인쇄 할 때 때문에이보고 있어요 :

[u'[chartsjs]\r\nname: mychart\r\ntype: line\r\nlabels: fish, cat, dog\r\ndata: 4, 5, 6\r\ndata2:5, 7, 9\r\n[/chartsjs]\r\n\r\nthis is some text now fool\r\n\r\n[chartsjs]\r\nname: second\r\ntype: line\r\nlabels: 100, 500, 1000\r\ndata: 50, 100, 10000\r\ndata2: 100, 100, 100\r\n[/chartsjs]'] 

정규식에서 첫 번째 일치 항목을 반환하고 임의의 테스트를 제거한 다음 다른 임의의 일치 항목을 찾습니다. 이것을 할 수있는 방법이 있습니까?

+0

* 및 + 연산자는 욕심이 있습니다. 너는 정확히 무엇을하고 싶니? 변수에서 원하는 결과는 무엇입니까? 철자를 쓰시 오. – kabanus

+0

@deltasekelta 업데이트 된 답변 확인하기 그냥 물음표가 빠졌습니까? '? – MYGz

답변

5

정규 표현식에서 단 하나의 문제가 있습니다.

.*은 모든 경로에 탐욕스럽게 맞설 것입니다. 첫 번째 마감 인 [/charts]을 만나면 더 이상 [/charts]이 있는지 확인합니다. 발견되면 진행됩니다.

처음에는 [/charts]에서 멈추게하려면 물음표를 넣고 게으르다. .*? 이것은 내가 그것을 테스트 봐 모든 것을 일치 유지하고 첫번째 [/charts]

에서 정지됩니다

import re 

a=""" 
[charts] 
name: mychart 
type: line 
labels: fish, cat, dog 
data: 4, 5, 6 
data2:5, 7, 9 
[/charts] 

this is some text 

[charts] 
name: second 
type: line 
labels: 100, 500, 1000 
data: 50, 100, 10000 
data2: 100, 100, 100 
[/charts] 
""" 

for c in re.findall('(\[charts\].*?\[/charts\])',a, re.DOTALL): 
    print c 

출력 :

[charts] 
name: mychart 
type: line 
labels: fish, cat, dog 
data: 4, 5, 6 
data2:5, 7, 9 
[/charts] 
[charts] 
name: second 
type: line 
labels: 100, 500, 1000 
data: 50, 100, 10000 
data2: 100, 100, 100 
[/charts] 
1

여기서 중요한 것은 당신이 원하는 것입니다 * 수. a. * ?. 정규 표현식을 최적화하는 다른 방법이 있습니다. 다른 사람들이 대답 했었지만 질문의 근원은 그 [/ charts] 패턴을 볼 때까지 모든 것을 일치시키고 싶다고 생각합니까? 당신을 줄 것입니다.

+0

다른 방법으로 \ s \ S 플래그를 사용하여 최적화 할 수 있습니까? 다른 무엇이 더 좋게 만들 수 있는지에 대해 궁금합니다. – deltaskelta

+0

가능하면 구체적인 것을 사용하는 것이. Regex에서. 당신이 사용하는 경우 큰 문자열에 매우 시간이 걸리는 backtracking으로 얻을 수 있습니다. 혼자. \ s \ S는 사용하는 것만 큼 다른 것은 아닙니다. 그래서 다른 사람들이 답을 얻은 것처럼 철회합니다. 그러나 앞으로의 특정 유스 케이스에 따라서는 좋은 지식이 있습니다. –