2013-05-27 5 views
3

다음 문자열을 사용하여 단어의 정확한 일치를 찾습니다.정확히 일치하는 문자열을 찾을 수

def exact_Match(str1, word): 
    result = re.findall('\\b'+word+'\\b', str1, flags=re.IGNORECASE) 
    if len(result)>0: 
     return True 
    else: 
     return False 

exact_Match(str1, word) 

는하지만 두 단어 "상"과는 다음과 같은 문자열 수상 경력을해야 할 때 "상을받은"에 대한 정확한 일치를 얻을.

str1 = "award-winning blueberries" 
word1 = "award" 
word2 = "award-winning" 

어떻게이 같은 re.findall 하이픈 및 기타 구두점과 전체 단어 일치하는 것을 얻을 수 있나요? 내 통역 여기에서

def exact_Match(phrase, word): 
    b = r'(\s|^|$)' 
    res = re.match(b + word + b, phrase, flags=re.IGNORECASE) 
    return bool(res) 

복사 - 붙여 넣기 :

답변

6

자신의 단어 경계를 확인

>>> str1 = "award-winning blueberries" 
>>> word1 = "award" 
>>> word2 = "award-winning" 
>>> exact_Match(str1, word1) 
False 
>>> exact_Match(str1, word2) 
True 

사실, bool에 캐스팅이 불필요하고 전혀 도움이되지 않습니다. 이 기능은없이 더 나을 수 있습니다 :

def exact_Match(phrase, word): 
    b = r'(\s|^|$)' 
    return re.match(b + word + b, phrase, flags=re.IGNORECASE) 

참고 : exact_Match 꽤 틀에 얽매이지 않는 케이스입니다. 그냥 exact_match라고 부르세요.

+0

의견을 보내 주셔서 감사합니다. 그러나, 그것은 작동하지 않는 것 같습니다. 코드를 넣으면 모든 경우에 None이 반환됩니다. – lost9123193

+0

@ lost9123193 코드를 복사하지 않았거나 변경 한 것 같습니다. 그것은 나를 위해 작동하고, 나는 여기에서 그것을 복사했습니다. – Elazar

1

초기 방법의 문제는 '\\b' 당신이 찾고 제로 폭 주장 검색을 표시하지 않습니다. Regular Expression HOWTO

\b

에서

-가 비 때문에 - (see this link이 그랬다면 백 슬래시는 정규 표현식의 실제 번거 로움이 될 수 있기 때문에, 내가 대신 r'\b'을 사용) 영숫자 문자를 사용하는 경우 findall 정규식은 award이고 award-winingawards이 아닙니다.

당신의 검색 문구에 따라, 또한 Elazar에 의해 제안 대신 re.matchre.findall를 사용하여 생각합니다. 귀하의 예제에서 re.match이 작동하지만, 찾고있는 단어가 문자열 시작 부분을 넘어서 중첩되어 있으면 re.match이 성공하지 못합니다.

관련 문제