Я работаю с Python v2 и пытаюсь выяснить, можно ли определить, находится ли слово в строке.
Я нашел некоторую информацию о том, как определить, есть ли слово в строке - с помощью .find, но есть ли способ сделать оператор IF. Я хотел бы получить что-то вроде следующего:
if string.find(word):
print 'success'
Спасибо за любую помощь.
if 'seek' in 'those who seek shall find':
print('Success!')
но имейте в виду, что это соответствует последовательности символов, а не обязательно целому слову - например, 'word' в 'swordsmith'
является True. Если вам нужны только целые слова, используйте регулярные выражения:
import re
def findWholeWord(w):
return re.compile(r'\b({0})\b'.format(w), flags=re.IGNORECASE).search
findWholeWord('seek')('those who seek shall find') # -> <match object>
findWholeWord('word')('swordsmith') # -> None
Если вы хотите узнать, находится ли целое слово в разделенном пробелом списке слов, просто используйте:
def contains_word(s, w):
return (' ' + w + ' ') in (' ' + s + ' ')
contains_word('the quick brown fox', 'brown') # True
contains_word('the quick brown fox', 'row') # False
Этот элегантный метод также самый быстрый. По сравнению с подходами Хью Ботвелла и даСонга:
>python -m timeit -s "def contains_word(s, w): return (' ' + w + ' ') in (' ' + s + ' ')" "contains_word('the quick brown fox', 'brown')"
1000000 loops, best of 3: 0.351 usec per loop
>python -m timeit -s "import re" -s "def contains_word(s, w): return re.compile(r'\b({0})\b'.format(w), flags=re.IGNORECASE).search(s)" "contains_word('the quick brown fox', 'brown')"
100000 loops, best of 3: 2.38 usec per loop
>python -m timeit -s "def contains_word(s, w): return s.startswith(w + ' ') or s.endswith(' ' + w) or s.find(' ' + w + ' ') != -1" "contains_word('the quick brown fox', 'brown')"
1000000 loops, best of 3: 1.13 usec per loop
Редактировать: Небольшой вариант этой идеи для Python 3.6+, одинаково быстро:
def contains_word(s, w):
return f' {w} ' in f' {s} '
find возвращает целое число, представляющее индекс места, где был найден искомый элемент. Если он не найден, возвращается -1.
haystack = 'asdf'
haystack.find('a') # result: 0
haystack.find('s') # result: 1
haystack.find('g') # result: -1
if haystack.find(needle) >= 0:
print 'Needle found.'
else:
print 'Needle not found.'
Вы можете разделить строку на слова и проверить список результатов.
if word in string.split():
print 'success'
Эта небольшая функция сравнивает все поисковые слова в данном тексте. Если все поисковые слова найдены в тексте, возвращает длину поиска или False
в противном случае.
Также поддерживает поиск строк Unicode.
def find_words(text, search):
"""Find exact words"""
dText = text.split()
dSearch = search.split()
found_word = 0
for text_word in dText:
for search_word in dSearch:
if search_word == text_word:
found_word += 1
if found_word == len(dSearch):
return lenSearch
else:
return False
использование:
find_words('çelik güray ankara', 'güray ankara')
Если сопоставление последовательности символов недостаточно, и вам нужно сопоставить целые слова, вот простая функция, которая выполняет работу. Он в основном добавляет пробелы при необходимости и ищет это в строке:
def smart_find(haystack, needle):
if haystack.startswith(needle+" "):
return True
if haystack.endswith(" "+needle):
return True
if haystack.find(" "+needle+" ") != -1:
return True
return False
Это предполагает, что запятые и другие знаки препинания уже были устранены.
Поскольку вы просите слово, а не строку, я хотел бы представить решение, которое не чувствительно к префиксам / суффиксам и игнорирует регистр:
#!/usr/bin/env python
import re
def is_word_in_text(word, text):
"""
Check if a word is in a text.
Parameters
----------
word : str
text : str
Returns
-------
bool : True if word is in text, otherwise False.
Examples
--------
>>> is_word_in_text("Python", "python is awesome.")
True
>>> is_word_in_text("Python", "camelCase is pythonic.")
False
>>> is_word_in_text("Python", "At the end is Python")
True
"""
pattern = r'(^|[^\w]){}([^\w]|$)'.format(word)
pattern = re.compile(pattern, re.IGNORECASE)
matches = re.search(pattern, text)
return bool(matches)
if __name__ == '__main__':
import doctest
doctest.testmod()
Если ваши слова могут содержать специальные символы регулярного выражения (например, +
), вам нужен re.escape (слово)
Расширенный способ проверить точное слово, которое нам нужно найти в длинной строке:
import re
text = "This text was of edited by Rock"
#try this string also
#text = "This text was officially edited by Rock"
for m in re.finditer(r"\bof\b", text):
if m.group(0):
print "Present"
else:
print "Absent"
Использование regex - это универсальное решение, но оно сложно для этого случая.
Вы можете просто разделить текст на список слов. Для этого используйте метод split ( separator , num ) . Возвращает список всех слов в строке, используя разделитель в качестве разделителя. Если разделитель не указан, он разбивается на все пробелы (опционально вы можете ограничить количество расщеплений до num ).
list_of_words = mystring.split()
if word in list_of_words:
print 'success'
Это не будет работать для строки с запятыми и т. Д. Например:
mystring = "One,two and three"
# will split into ["One,two", "and", "three"]
Если вы также хотите разделить все запятые и т. Д. используйте аргумент separator следующим образом:
# whitespace_chars = " \t\n\r\f" - space, tab, newline, return, formfeed
list_of_words = mystring.split( \t\n\r\f,.;!?'\"()")
if word in list_of_words:
print 'success'
Вы можете просто добавить пробел до и после «слова».
x = raw_input("Type your word: ")
if " word " in x:
print "Yes"
elif " word " not in x:
print "Nope"
Таким образом, он ищет пространство до и после «слова».
>>> Type your word: Swordsmith
>>> Nope
>>> Type your word: word
>>> Yes