답변:
무엇이 잘못 되었습니까?
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} '
contains_word("says", "Simon says: Don't use this answer")
문자열을 단어로 나누고 결과 목록을 확인할 수 있습니다.
if word in string.split():
print 'success'
이 작은 함수는 주어진 텍스트에서 모든 검색어를 비교합니다. 모든 검색어가 텍스트로 발견되면 검색 길이 등을 반환합니다 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')
일련의 문자를 일치시키는 것이 충분하지 않고 전체 단어를 일치시켜야하는 경우 작업을 수행하는 간단한 함수가 있습니다. 기본적으로 필요한 곳에 공백을 추가하고 문자열에서 공백을 검색합니다.
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
이것은 쉼표와 다른 문장 부호가 이미 제거되었다고 가정합니다.
문자열이 아닌 단어를 요구할 때 접두사 / 접미사에 민감하지 않고 대소 문자를 무시하는 솔루션을 제시하고 싶습니다.
#!/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)
정규식을 사용하는 것이 해결책이지만 그 경우에는 너무 복잡합니다.
텍스트를 단어 목록으로 간단히 나눌 수 있습니다. 이를 위해 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'
mystring.lower().split()
그리고 word.lower()
이것이 정규식 예제보다 빠르다고 생각합니다.