Python-단어가 문자열인지 확인


177

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

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

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

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

답변:


350

무엇이 잘못 되었습니까?

if word in mystring: 
   print 'success'

103
주의해서, "paratyphoid is bad"라는 문자열이 있고 "paratyphoid is bad"에서 "typhoid"를하면 사실을 얻게됩니다.
David Nelson

3
누구나이 문제를 극복하는 방법을 알고 있습니까?
user2567857

4
@ user2567857, 정규 표현식-휴 보웰의 답변을 참조하십시오.
Mark Rajcok

4
if (mystring의 word1 및 mystring의 word2)
louie mcconnell

2
이것이 어떻게 받아 들여 질까요? !! 그냥 수표는 일련의 문자 (한 마디) 캐릭터 라인에 표시할지 여부
페드 람 bashiri

168
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

3
각 단어를 통과하는 for 루프를 만들지 않고도 여러 단어를 검색하는 방법이 정말 있습니까 (예 : 수천 단어)? 나는 어떤 문장이 어떤 단어와 일치 하는지를 찾기 위해 백만 개의 문장과 백만 개의 용어를 검색합니다. 현재 처리하는 데 며칠이 걸리며 더 빠른 방법이 있는지 알고 싶습니다.
Tom

대신 파이썬 정규식의 그렙 사용하려고 @ 톰
엘 Ruso에게

검술을위한 p1
Robino

예를 들어 문자열에서 단어를 찾을 수없는 경우와 같은 예외를 어떻게 처리합니까?
FaCoffee

1
@FaCoffee : 문자열을 찾지 못하면이 함수는 None을 반환합니다 (위의 마지막 예 참조).
휴 Bothwell

48

전체 단어가 공백으로 구분 된 단어 목록에 있는지 확인하려면 다음을 사용하십시오.

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

3
이것은 내가 가장 좋아하는 답변입니다 :)
IanS

동의하지만 가장 빠른 해결책은 re.compile (... does)와 같은 경우를 무시하지 않습니다.
Michael Smith

7
이것은 몇 가지 문제가있다 : (1) 끝에있는 단어 (2) 처음에있는 단어 (3) 사이에있는 단어contains_word("says", "Simon says: Don't use this answer")
Martin Thoma

@MartinThoma-명시된 바와 같이,이 방법은 "전체 단어가 공백으로 구분 된 단어 목록에 있는지 여부"를 찾기위한 것입니다. 이 상황에서는 다음과 같은 경우에 잘 작동합니다. (1) 끝에있는 단어 (2) 시작에있는 단어 (3) 사이에있는 단어. 단어 목록에 콜론이 포함되어 있기 때문에 예제가 실패합니다.
user200783

1
@JeffHeaton 다시 한번,이 방법은 저자가 명확하게 언급 한 것처럼 "전체 단어가 공백으로 구분 된 단어 목록에 있는지 여부를 확인하려는 경우"입니다.
비트 스위치

17

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

13

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

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

3
편집 링크를 사용 하여이 코드의 작동 방식을 설명하고 코드를 제공하지 마십시오. 설명은 향후 독자에게 도움이 될 것입니다.
Jed Fox

1
이것은 전체 단어를 일치시키는 실제 답변이어야합니다.
Kaushik NP

10

이 작은 함수는 주어진 텍스트에서 모든 검색어를 비교합니다. 모든 검색어가 텍스트로 발견되면 검색 길이 등을 반환합니다 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')

8

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

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

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


이 솔루션은 토큰으로 구분 된 공백으로 구분 된 문자열을 사용하므로 내 경우에 가장 효과적이었습니다.
Avijit

4

문자열이 아닌 단어를 요구할 때 접두사 / 접미사에 민감하지 않고 대소 문자를 무시하는 솔루션을 제시하고 싶습니다.

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


3

긴 문자열에서 찾아야하는 정확한 단어를 확인하는 고급 방법 :

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

정규식을 사용하는 것이 해결책이지만 그 경우에는 너무 복잡합니다.

텍스트를 단어 목록으로 간단히 나눌 수 있습니다. 이를 위해 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"]

모든 쉼표 등으로 분할하려면 다음과 같이 구분 기호를 사용 하십시오.

# 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
이것은 @Corvax와 유사한 좋은 솔루션이며, "First : there .."와 같은 문자열에서 "First"라는 단어를 찾을 수 있도록 분할 할 공통 문자를 추가하는 이점이 있습니다. @tstempko는 추가 문자에 ":"을 포함하지 않습니다. 나는 :). 또한 검색이 대소 문자를 구분하지 않으면 분할하기 전에 단어와 문자열 모두에서 .lower ()를 사용하는 것이 좋습니다. mystring.lower().split()그리고 word.lower() 이것이 정규식 예제보다 빠르다고 생각합니다.
beauk

0

"단어"앞뒤에 공백을 추가 할 수 있습니다.

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

이런 식으로 "word"앞뒤의 공백을 찾습니다.

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

2
그러나 단어가 문장의 시작 또는 끝에 있다면 (공백 없음)
MikeL
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.