Найти подстроку в строке, но только целые слова?
Что является элегантным способом поиска строки в другой строке в Python, но только если подстрока находится в пределах целых слов, а не части слова?
Возможно, пример продемонстрирует, что я имею в виду:
string1 = "ADDLESHAW GODDARD"
string2 = "ADDLESHAW GODDARD LLP"
assert string_found(string1, string2) # this is True
string1 = "ADVANCE"
string2 = "ADVANCED BUSINESS EQUIPMENT LTD"
assert not string_found(string1, string2) # this should be False
Как лучше всего написать функцию string_found, которая будет делать то, что мне нужно? Я подумал, что, возможно, я мог бы помыслить это чем-то вроде этого:
def string_found(string1, string2):
if string2.find(string1 + " "):
return True
return False
Но это не очень элегантно, а также не будет соответствовать string1, если бы оно было в конце строки2. Может быть, мне нужно регулярное выражение? (argh regex fear)
Ответы
Ответ 1
Вы можете использовать регулярные выражения и специальный символ границы слова \b
(выделите мной):
Соответствует пустой строке, но только в начале или конце слова. Слово определяется как последовательность буквенно-цифровых символов или символов подчеркивания, поэтому конец слова обозначается пробелом или не алфавитно-цифровым символом, не подчеркиванием. Обратите внимание, что \b
определяется как граница между \w
и \W
, поэтому точный набор символов, который считается буквенно-цифровым, зависит от значений флагов UNICODE
и LOCALE
. Внутри символьного диапазона \b
представляет символ возврата, для совместимости со строковыми литералами Pythons.
def string_found(string1, string2):
if re.search(r"\b" + re.escape(string1) + r"\b", string2):
return True
return False
демонстрация
Если границы слов являются для вас только пробелами, вы также можете обойтись без pre- и добавления пробелов к строкам:
def string_found(string1, string2):
string1 = " " + string1.strip() + " "
string2 = " " + string2.strip() + " "
return string2.find(string1)
Ответ 2
Здесь можно сделать это без регулярного выражения (в соответствии с запросом), предполагая, что вы хотите, чтобы любой пробел служил разделителем слов.
import string
def find_substring(needle, haystack):
index = haystack.find(needle)
if index == -1:
return False
if index != 0 and haystack[index-1] not in string.whitespace:
return False
L = index + len(needle)
if L < len(haystack) and haystack[L] not in string.whitespace:
return False
return True
И вот некоторые демонстрационный код (кодовое слово - отличная идея: спасибо Феликс Клинг за то, что напомнили мне)
Ответ 3
Я полагаю, что самый простой и самый питонический способ - разбить строки на отдельные слова и найти совпадение:
string = "My Name Is Josh"
substring = "Name"
for word in string.split():
if substring == word:
print("Match Found")
Для получения бонуса, здесь онелинер:
any([substring == word for word in string.split()])
Ответ 4
Один подход с использованием модуля re
или регулярного выражения, который должен выполнить эту задачу:
import re
string1 = "pizza pony"
string2 = "who knows what a pizza pony is?"
search_result = re.search(r'\b' + string1 + '\W', string2)
print(search_result.group())