2016-12-07 1 views
1

정규 표현식을 사용하여 대학 이름을 추출하고 있습니다. 주로 두 가지 패턴이 관찰됩니다.다른 정규식 패턴에 우선 순위를 부여하는 방법

  1. "일부 이름"대학 -> 예 : "뭔가"안나 대학
  2. 대학 -> 예 : 엑서 터
  3. 이 들어

의 대학, 나는대로이 패턴을 작성했습니다,

regex = re.compile('|'.join([r'[Uu]niversity of (\w+){1,3}',r'(?:\S+\s){1,3}\S*[uU]niversity'])) 

그러나 적절한 경우 예상 답변을 얻지 못할 경우가 있습니다. 정규 표현식 위의 적용 예를 들어 ,이 문장의 경우

sentence = "Biology Department University of Vienna" 

, 내가 잘못이다

"Biology Department University" 

을 얻고있다. 두 패턴이 일치하므로 두 번째 패턴이 일치하고 구문이 추출됩니다.

첫 번째 패턴에 우선 순위를 부여해야하기 때문에 비슷한 시나리오에서 "무언가의 대학"이 추출됩니다.

는 사람이 일반적으로

답변

4

을 도울 수, 정규 표현식에서 교대는 왼쪽에서 오른쪽으로 평가됩니다, 그래서 가장 왼쪽의 대안은 그들에게 우선 순위를 부여 먼저 확인됩니다. 당신은 이미 그것을 했지 - 당신이 여전히 교대의 오른쪽에서 일치를 얻은 이유는 그 일치가 그 문자열의 더 일찍 가능하다는 것입니다.

그러므로 더 구체적이어야하고 일치 만 허용하려면 of이 필요합니다. 이 경우 negative lookahead assertion을 사용할 수 있습니다.

regex = re.compile('|'.join([r'university of (\w+){1,3}', 
          r'(?:\S+\s){1,3}\S*university(?!\s+of\b)']), 
        flags=re.I) 
관련 문제