Programing

Python-단어가 문자열에 있는지 확인

lottogame 2020. 6. 4. 07:48
반응형

Python-단어가 문자열에 있는지 확인


Python v2로 작업 중이며 단어가 문자열인지 여부를 알 수 있는지 확인하려고합니다.

.find를 사용하여 단어가 문자열에 있는지 식별하는 방법에 대한 정보를 찾았지만 IF 문을 수행하는 방법이 있습니다. 다음과 같은 것을 갖고 싶습니다.

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

도움을 주셔서 감사합니다.


무엇이 잘못 되었습니까?

if word in mystring: 
   print 'success'

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

그러나이 단어는 반드시 전체 단어 일 필요는없는 일련의 문자와 일치합니다 'word' in '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

이 우아한 방법도 가장 빠릅니다. 휴 Bothwell과 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

편집 : 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.'

이 작은 함수는 주어진 텍스트에서 모든 검색어를 비교합니다. 모든 검색어가 텍스트로 발견되면 검색 길이 등을 반환합니다 False.

유니 코드 문자열 검색도 지원합니다.

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

문자열을 단어로 나누고 결과 목록을 확인할 수 있습니다.

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

일련의 문자를 일치시키는 것이 충분하지 않고 전체 단어를 일치시켜야하는 경우 작업을 수행하는 간단한 함수가 있습니다. 기본적으로 필요한 곳에 공백을 추가하고 문자열에서 공백을 검색합니다.

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

이것은 쉼표와 다른 문장 부호가 이미 제거되었다고 가정합니다.


As you are asking for a word and not for a string, I would like to present a solution which is not sensitive to prefixes / suffixes and ignores case:

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

If your words might contain regex special chars (such as +), then you need re.escape(word)


Advanced way to check the exact word, that we need to find in a long string:

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"

You could just add a space before and after "word".

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

This way it looks for the space before and after "word".

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

Using regex is generall solution, but it is to complicated for that case.

You can simply split text into list of words. Use split(separator, num) method for that. It returns a list of all the words in the string, using separator as the separator. If separator is unspecified it splits on all whitespace (optionally you can limit the number of splits to num).

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

This will not work for string with commas etc. For example:

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

If you also want to split on all commas etc. use separator argument like this:

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

참고URL : https://stackoverflow.com/questions/5319922/python-check-if-word-is-in-a-string

반응형