2017-10-31 2 views
0

독일어 작업 이름의 변형이 주어진 문자열에 몇 번 나타나는지 찾으려고합니다. 작업 이름이 Schneider (Tailor)이라고 가정합니다. 변종은 작업 이름 자체를 포함하여 (작업 이름의 남성과 여성의 형태를 나타내는 것은)입니다Regexes : 정확한 일치 횟수를 계산하십시오.

Schneider Schneiderin Schneider/in Schneider/-in Schneider (m/w) 

각 변형이 개별적으로 계산 무시해야합니다

Schneider 
Schneiderin 
Schneider/in 
Schneider/-in 
Schneider (m/w) 

그래서 나는 다음과 같은 문자열이 있다고 가정 변형 사이의 겹침 따라서 각 변형을 살펴보고 위의 문자열에서 발생 횟수를 계산하면 결과는 항상 1이어야합니다.

단어 경계를 사용하여 정규식으로이를 해결하려고했습니다. 다음 패턴을 사용했습니다.

\b{}\b(?![\/]|(\s\(m\/w\))) 

{}은 변형으로 대체됩니다.

정규식에서 단어 일치를 확인하기 위해 단어 경계를 사용합니다. 또한 forward lookahead를 사용하여 슬래시를 제외하고 (m/w)을 단어 경계로 취급하지 않습니다.

문자열에서 찾을 수없는 마지막 패턴 (Schneider (m/w))을 제외하고 패턴이 잘 작동합니다. 현재 작업에서 볼 수 있습니다 : 완성도를 위해서 https://regex101.com/r/FTqvIO/4

여기 파이썬에 내 현재의 구현입니다 :

import re 
def count_variant(variant, string): 
    pattern = re.compile(r'\b%s\b(?![\/]|(\s\(m\/w\)))' % variant) 
    matches = re.findall(pattern, string) 
    return len(matches) 

모든 정규식에 대한 도움말 (또는 가능한 경우 더 쉬운 방법은) 대단히 감사를!

편집 : Regex101

에 올바른 링크를 삽입

답변

1

당신은 사용할 수 있습니다 명확한 단어 경계 :

r'(?<!\w){}(?![\w/]|\s\(m/w\))'.format(re.escape(word)) 

이 단어가 (?<!\w) 경기를 실패합니다 regex demo

가 있는지 검색 단어 앞에 char가 있고 (?!\w) 인 경우 검색 단어 뒤에 char 문자가 있으면 일치하지 않습니다.

+0

야, 너 락! – tiefenauer

관련 문제