2013-05-27 4 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 соответствовал целым словам с дефисами и другими пунктуациями?

ответ

6

Сделать свою собственную словесную границу:

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

копировать-вставить здесь к моему переводчику:

>>> 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' не обозначает поиск утверждения нулевой ширины, который вы ищете. (А если это так, я хотел бы использовать вместо r'\b', потому что обратная косая черта может стать реальным хлопот в регулярных выражениях - see this link)

От Regular Expression HOWTO

\b

Поскольку - является не- буквенно-цифровой символ, ваше регулярное выражение findall найдет award в award-wining, но не в awards.

В зависимости от вашей искомой фразы, я бы также подумал об использовании re.findall вместо re.match, как предложено Elazar. В вашем примере re.match работает, но если искомое слово вложено где-нибудь за пределы строки, re.match не удастся.