Python – Comprueba si la palabra está en una cadena

Estoy trabajando con Python v2, y estoy tratando de averiguar si puedes decir si una palabra está en una cadena.

He encontrado información sobre cómo identificar si la palabra está en la cadena, usando .find, pero hay una manera de hacer una statement IF. Me gustaría tener algo como lo siguiente:

if string.find(word): print 'success' 

Gracias por cualquier ayuda.

Lo que está mal con:

 if word in mystring: print 'success' 
 if 'seek' in 'those who seek shall find': print('Success!') 

pero tenga en cuenta que esto coincide con una secuencia de caracteres, no necesariamente con una palabra completa; por ejemplo, 'word' in 'swordsmith' es Verdadero. Si solo quieres hacer coincidir palabras completas, deberías usar expresiones regulares:

 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') # ->  findWholeWord('word')('swordsmith') # -> None 

Si desea saber si una palabra completa está en una lista de palabras separadas por espacios, simplemente use:

 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 

Este elegante método es también el más rápido. En comparación con los enfoques de Hugh Bothwell y daSong:

 >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 

Edición: una ligera variante de esta idea para Python 3.6+, igualmente rápido:

 def contains_word(s, w): return f' {w} ' in f' {s} ' 

find devuelve un entero que representa el índice donde se encontró el elemento de búsqueda. Si no se encuentra, devuelve -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.' 

Esta pequeña función compara todas las palabras de búsqueda en un texto dado. Si todas las palabras de búsqueda se encuentran en el texto, devuelve la duración de la búsqueda, o False caso contrario.

También soporta búsqueda de cadenas 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 

uso:

 find_words('çelik güray ankara', 'güray ankara') 

Puede dividir la cadena a las palabras y verificar la lista de resultados.

 if word in string.split(): print 'success' 

Si la coincidencia de una secuencia de caracteres no es suficiente y necesita hacer coincidir palabras completas, esta es una función simple que hace el trabajo. Básicamente, agrega espacios donde es necesario y busca eso en la cadena:

 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 

Esto supone que las comas y otras puntuaciones ya se han eliminado.

Como solicita una palabra y no una cadena, me gustaría presentar una solución que no sea sensible a los prefijos / sufijos e ignore el caso:

 #!/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() 

Si sus palabras pueden contener caracteres especiales de expresiones regulares (como + ), entonces necesita re.escape(word)

Una forma avanzada de verificar la palabra exacta, que necesitamos encontrar en una cadena larga:

 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" 

Usted podría simplemente agregar un espacio antes y después de “palabra”.

 x = raw_input("Type your word: ") if " word " in x: print "Yes" elif " word " not in x: print "Nope" 

De esta manera busca el espacio antes y después de “word”.

 >>> Type your word: Swordsmith >>> Nope >>> Type your word: word >>> Yes 

Usar regex es una solución general, pero es demasiado complicado para ese caso.

Simplemente puede dividir el texto en una lista de palabras. Utilice el método de división ( separador , num ) para eso. Devuelve una lista de todas las palabras en la cadena, utilizando el separador como el separador. Si no se especifica el separador, se divide en todos los espacios en blanco (opcionalmente, puede limitar el número de divisiones a num ).

 list_of_words = mystring.split() if word in list_of_words: print 'success' 

Esto no funcionará para cadenas con comas, etc. Por ejemplo:

 mystring = "One,two and three" # will split into ["One,two", "and", "three"] 

Si también desea dividir en todas las comas, etc. use un argumento separador como este:

 # 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'