[python] 다른 문자열에 여러 문자열이 있는지 확인

배열의 문자열이 다른 문자열에 있는지 어떻게 확인할 수 있습니까?

처럼:

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길이는 strA이고에있는 모든 문자열 의 길이의 합입니다 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 을 언급했습니다 .

다음은 파이썬에서 사용하는 한 가지 방법입니다.

  1. 여기 에서 aho_corasick.py를 다운로드 하십시오

  2. 기본 Python 파일과 동일한 디렉토리에 넣고 이름을 지정하십시오. aho_corasick.py

  3. 다음 코드를 사용하여 알고리즘을 시도하십시오.

    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"