2016-06-29 3 views
0

파이썬의 문자열에서 'lep'의 모든 어커런스를 반환하고 싶지만 'filepath'나 'telephone'과 같은 하위 문자열에 어커런스가없는 경우를 가정 해 봅시다.어떻게 정규 표현식을 사용하여 특정 단어에 포함되지 않은 문자를 일치시킬 수 있습니까?

(?<!te|fi)lep(?!hone|ath) 

는 그러나, 나는 '텔레파시'와 'filephone'뿐만 아니라 '알기 위해 Filep'와 'telep'을 원하는가 : 지금은 부정적 예측/lookbehind의 조합을 사용하고 있습니다. 나는 유사한 질문을 보았으나 이러한 유형의 선견지명/뒤에서의 조합을 다루는 것은 아닙니다.

감사합니다!

+0

정규식이 가장 적합한 도구입니까? – jonrsharpe

+0

긍정적 인 것은 아니지만 사용자가 제공 한 검색어에서 정규식 문자열을 작성하여 백만 개 정도의 코드 행을 검색합니다. 나는 그 라인들 각각에 걸쳐 용어 목록에있는 각 용어보다는 그 라인들 각각에 걸쳐 하나의 정규식 패턴을 실행하는 것이 더 나을 것이라고 생각한다. – jengelhart

+0

왜'telepath'가 허용되었지만'filepath'가 아닌가요? 어떤 단어가 허용/금지되는지에 대한 기준을 어떻게 결정합니까? –

답변

1

룩어 헤드를 룩어 힌드 안에 배치 할 수 있으며 그 반대의 경우도 가능합니다. 모든 룩어 헤드가 고정 길이로되어있는 한 실제로 그 조합을 사용합니다. 즉 (는 X 와 Y 엔드로 시작하지 않는) 하나에 두 가지 조건을 결합 할 수 있습니다 :

lep(?<!telep(?=hone))(?<!filep(?=ath)) 

는 lookbehinds 퍼팅 마지막도 더 효율적입니다. 접미사가 없더라도이 방법을 사용하는 것이 좋습니다 (예 : lep(?<!filep)을 제외하고 filep 제외).

그러나 lep -telephone -filepath과 같이 사용자 입력에서 정규식을 생성하는 것은 까다롭고 지루할 것입니다. 가능한 경우 원치 않는 단어를 먼저 검색하여 제거하는 것이 훨씬 쉬울 것입니다. 예를 들어, 검색 : 검색이 성공하고 group(1)None하지

(?:telephone|filepath|(lep)) 

경우, 히트입니다.

+0

그게 훌륭합니다. 당신의 도움을 주셔서 감사합니다. lookbehind를 가장 효율적으로 만드는 것은 무엇입니까? 검색하려는 문자열의 하위 문자열에 대해 일치하려는 부분이 실패하면 lookbehind를 무시할 수있는 것과 관련이 있습니까? – jengelhart

+0

바로 그 것입니다. Lookbehinds는 많은 사람들이 좋아하는 퍼포먼스를 먹는 몬스터가 아니지만 작업하는 것처럼 큰 텍스트에서는 최적화가 유용합니다. –

관련 문제