web-dev-qa-db-fra.com

Python - Vérifier si Word est dans une chaîne

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.

157
The Woo

Qu'est-ce qui ne va pas chez:

if Word in mystring: 
   print 'success'
315
fabrizioM
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
146
Hugh Bothwell

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} '
32
user200783

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.'
14
Matt Howell

Vous pouvez scinder la chaîne en mots et consulter la liste des résultats.

if Word in string.split():
    print 'success'
9
Corvax

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')
9
Guray Celik

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.

6
daSong

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)

4
Martin Thoma

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"
3
Rameez

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'
1
tstempko

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
1
PyGuy