Je travaille avec Python v2 et j'essaie de savoir si vous pouvez dire si un mot est dans une chaîne.
J'ai trouvé des informations sur l'identification du mot dans la chaîne - en utilisant .find, mais existe-t-il un moyen de faire une instruction IF? Je voudrais avoir quelque chose comme ce qui suit:
if string.find(Word):
print 'success'
Merci pour toute aide.
Qu'est-ce qui ne va pas chez:
if Word in mystring:
print 'success'
if 'seek' in 'those who seek shall find':
print('Success!')
mais gardez à l'esprit que cela correspond à une séquence de caractères, pas nécessairement à un mot entier - par exemple, 'Word' in 'swordsmith'
est True. Si vous souhaitez uniquement faire correspondre des mots entiers, vous devez utiliser des expressions régulières:
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
Si vous voulez savoir si un mot entier se trouve dans une liste de mots séparés par des espaces, utilisez simplement:
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
Cette méthode élégante est aussi la plus rapide. Par rapport aux approches de Hugh Bothwell et de 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
Edit: Une légère variante de cette idée pour Python 3.6+, de manière tout aussi rapide:
def contains_Word(s, w):
return f' {w} ' in f' {s} '
find renvoie un entier représentant l'index de l'endroit où l'élément de recherche a été trouvé. S'il n'est pas trouvé, il retourne -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.'
Vous pouvez scinder la chaîne en mots et consulter la liste des résultats.
if Word in string.split():
print 'success'
Cette petite fonction compare tous les mots de recherche dans un texte donné. Si tous les mots de recherche sont trouvés dans le texte, retourne la longueur de la recherche ou False
sinon.
Prend également en charge la recherche de chaînes 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
usage:
find_words('çelik güray ankara', 'güray ankara')
Si la correspondance d'une séquence de caractères ne suffit pas et que vous devez faire correspondre des mots entiers, voici une fonction simple qui vous permet d'accomplir votre travail. Fondamentalement, il ajoute des espaces si nécessaire et le recherche dans la chaîne:
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
Cela suppose que les virgules et autres ponctuations ont déjà été supprimées.
Comme vous demandez un mot et non une chaîne, je voudrais présenter une solution insensible aux préfixes/suffixes et ignorer la casse:
#!/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 __== '__main__':
import doctest
doctest.testmod()
Si vos mots peuvent contenir des caractères spéciaux regex (tels que +
), vous avez besoin de re.escape(Word)
Manière avancée de vérifier le mot exact, que nous devons trouver dans une longue chaîne:
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"
Utiliser regex est une solution générale, mais elle est trop compliquée pour ce cas.
Vous pouvez simplement scinder le texte en une liste de mots. Utilisez split () séparateur , num ) méthode pour cela. Il retourne une liste de tous les mots de la chaîne, en utilisant séparateur comme séparateur. Si séparateur n'est pas spécifié, il se scinde dans tous les espaces (vous pouvez éventuellement limiter le nombre de scissions à num ).
list_of_words = mystring.split()
if Word in list_of_words:
print 'success'
Cela ne fonctionnera pas pour les chaînes avec des virgules, etc. Par exemple:
mystring = "One,two and three"
# will split into ["One,two", "and", "three"]
Si vous souhaitez également séparer toutes les virgules, etc., utilisez séparateur argument comme ceci:
# 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'
Vous pouvez simplement ajouter un espace avant et après "Word".
x = raw_input("Type your Word: ")
if " Word " in x:
print "Yes"
Elif " Word " not in x:
print "Nope"
De cette façon, il recherche l’espace avant et après "Word".
>>> Type your Word: Swordsmith
>>> Nope
>>> Type your Word: Word
>>> Yes