배열의 문자열이 다른 문자열에 있는지 어떻게 확인할 수 있습니까?
처럼:
a = ['a', 'b', 'c']
str = "a123"
if a in str:
print "some of the strings found in str"
else:
print "no strings found in str"
그 코드는 작동하지 않습니다. 달성하려는 것을 보여주기 위해서입니다.
답변
당신은 사용할 수 있습니다 any
:
a_string = "A string is more than its parts!"
matches = ["more", "wholesome", "milk"]
if any(x in a_string for x in matches):
마찬가지로 목록의 모든 문자열 이 있는지 확인 하려면 all
대신을 사용하십시오 any
.
답변
any()
원하는 모든 것이 True
또는 False
인 경우 가장 좋은 방법 이지만, 어떤 문자열 / 문자열이 일치하는지 구체적으로 알고 싶다면 몇 가지를 사용할 수 있습니다.
첫 번째 일치를 원할 경우 ( False
기본값) :
match = next((x for x in a if x in str), False)
모든 경기 (중복 포함)를 얻으려면 :
matches = [x for x in a if x in str]
중복되지 않은 모든 일치 항목을 얻으려면 (순서 무시) :
matches = {x for x in a if x in str}
중복되지 않은 모든 일치 항목을 올바른 순서로 얻으려면 다음을 수행하십시오.
matches = []
for x in a:
if x in str and x not in matches:
matches.append(x)
답변
줄 이 길어 a
지거나 str
길어질 경우주의해야합니다 . 간단한 솔루션은 O (S * (A ^ 2))를 취합니다. 여기서 S
길이는 str
A이고에있는 모든 문자열 의 길이의 합입니다 a
. 더 빠른 솔루션을 위해 선형 시간 O (S + A)로 실행되는 문자열 일치에 대한 Aho-Corasick 알고리즘을 살펴보십시오 .
답변
다음과 regex
같이 다양성을 추가하십시오 .
import re
if any(re.findall(r'a|b|c', str, re.IGNORECASE)):
print 'possible matches thanks to regex'
else:
print 'no matches'
또는 목록이 너무 긴 경우- any(re.findall(r'|'.join(a), str, re.IGNORECASE))
답변
a의 요소를 반복해야합니다.
a = ['a', 'b', 'c']
str = "a123"
found_a_string = False
for item in a:
if item in str:
found_a_string = True
if found_a_string:
print "found a match"
else:
print "no match found"
답변
jbernadas는 복잡성을 줄이기 위해 이미 Aho-Corasick-Algorithm 을 언급했습니다 .
다음은 파이썬에서 사용하는 한 가지 방법입니다.
-
기본 Python 파일과 동일한 디렉토리에 넣고 이름을 지정하십시오.
aho_corasick.py
-
다음 코드를 사용하여 알고리즘을 시도하십시오.
from aho_corasick import aho_corasick #(string, keywords) print(aho_corasick(string, ["keyword1", "keyword2"]))
검색은 대소 문자를 구분합니다.
답변
a = ['a', 'b', 'c']
str = "a123"
a_match = [True for match in a if match in str]
if True in a_match:
print "some of the strings found in str"
else:
print "no strings found in str"