2009-09-17 3 views
0

다음과 같은 여러 줄의 문자열이 있습니다.파이썬에서 정규 표현식의 중간에 단어를 생략하려면 어떻게해야합니까?

"...Togo...Togo...Togo...ACTIVE..." 

세 번째 'Togo'와 'ACTIVE'및 나머지 문자열 사이를 모두 가져 오려고합니다. 이 작업을 수행 할 수있는 정규 표현식을 작성할 수 없습니다.

reg = "(Togo^[Togo]*?)(ACTIVE.*)" 

과 같은 것을 시도해도 아무 것도 캡처되지 않습니다 (그룹 캡처에 첫 번째와 마지막 괄호가 필요합니다).

답변

1

.*(Togo.*?)(ACTIVE.*) 

선도 .* 욕심, 그래서 마지막 가능한 장소에서 다음 Togo 일치 : 이것은 단지 원하는 부분을 일치합니다. 캡처 된 부분은 마지막으로 Togo에서 시작됩니다.

식에서 ^[Togo]*?은 올바른 일을하지 않습니다. ^은 줄의 시작 부분과 일치하려고 시도하고 은 T, o 또는 g과 일치합니다. [^Togo]T, o 또는 g이 아닌 문자와 일치하기 때문에 작동하지 않습니다. 당신의 정규식에서

+0

Duh ... 내 시도보다 훨씬 간단합니다. –

+0

일반적으로 이것은 가장 좋은 제안 인 것처럼 보이지만 내 경우에는 너무 많은 시간이 걸립니다. 그래도 충분히 빠른 경우 이것이 최선의 방법이라고 생각합니다. – Tony

1
reg = "Togo.*Togo.*Togo(.*)ACTIVE" 

또는, 반드시 세 가지이며,이 시도 :

reg = "Togo(([^T]|T[^o]|To[^g]|Tog[^o])*T?.?.?)ACTIVE" 
1
"(Togo(?:(?!Togo).)*)(ACTIVE.*)" 

대괄호, 'O', 또는 'g'를 문자 'T'중 하나와 일치하는 문자 클래스를 형성한다. 캐럿 ('^')은 문자 클래스에없는 경우 입력의 시작 부분과 일치하며 문자 클래스를 반전 시키려면 대괄호 안에 사용할 수 있습니다.

내 정규 표현식에서 "Togo"라는 단어를 매치 한 후에 한 번에 한 문자 씩 일치 시키지만 "Togo"의 다른 인스턴스가 시작되지 않았는지 확인한 후에 만합니다. (?!Togo)negative lookahead이라고합니다.

관련 문제