2015-02-05 2 views
1

많은 수의 거대한 XML 파일 (최대 1GB)을 파싱 중이며 주어진 필드에 대해 약 700 개의 가능한 일치 목록을 상호 참조하고 있습니다. 일치하는 항목을 찾으면 필드 자체의 텍스트를 사용하는 대신 내 목록에서 일치하는 항목을 찾고 싶습니다. 파이썬에서 조건부 반복에 액세스

나는

<-- outside loops iterating over outer layer tags tags --> if any(re.search(s, parsedOutTag.text) for s in preCompiledRegexList): <-- checking innner layer tags for additional content-->

내가 조건이 만족 될 때 직접하면서 반복 s에 액세스하는 방법을 궁금 내 코드에 다음 줄을 가지고있다. 나는 현재 내가해야 할 일을 매우 해킹하고있다.

나는 그것이 분명하다는 것을 인정해야한다. Stack Overflow에 대한 다른 질문의 효율성을 위해이 라인을 채택 했으므로 모든 세부 사항을 정말로 알지 못한다.

답변

2

any 기능 단락 회로는 생성자 표현식에서 s 바인딩에 액세스 할 수 있다고하더라도 처음 일치하는 인스턴스 일뿐입니다. 만약 당신이 원하는 경우에, 당신은 단지 if 상태 랩을 해제 할 수 있습니다

for s in preCompiledRegexList: 
    if re.search(s, parsedOutTag.text): 
     # checking inner layer tags for additional content 
     break 

당신이 일치 preCompiledRegexList에있는 모든 항목을 처리, 중 위의 break를 제거하거나에만 일치하는 값을 산출 발전기를 사용하려면 필수 조건 :

for outer_s in (inner_s for inner_s in preCompiledRegexList of re.search(s, parsedOutTag.text): 
    # checking inner layer tags for additional content 

(다른 outer_sinner_s 라벨을 가지는 것은 필요하지 않습니다, 나는 단지 그들이 별도의 범위에 존재한다는 것을 강조하고 싶었다.)

+0

나는'if any()'문장 밖에서'for' 루프를 제거함으로써 계산상의 효율성을 잃지 않습니까? – Constantine

+0

나는 너를 믿을 수 없다. 일치하는 항목을 모두 처리하는 경우'any' 호출보다 오래 걸리는 것처럼 보일 수 있지만 언급 한 바와 같이'any'는 첫 번째 값의 처리를 중지하기 때문에 'True'입니다. –

+0

아니요, 정규식 목록의 모든 항목을 처리하지 않습니다. 나는 목록에서 단 하나의 매치가있을 것이라고 기대하고있다. – Constantine