파이썬에서 문자열이 목록의 요소를 포함하는지 확인하는 방법


217

나는 이와 같은 것을 가지고있다 :

extensionsToCheck = ['.pdf', '.doc', '.xls']

for extension in extensionsToCheck:
    if extension in url_string:
        print(url_string)

(for 루프를 사용하지 않고) 파이썬에서이를 수행하는보다 우아한 방법이 무엇인지 궁금합니다. 나는 C / C ++에서와 같은 이와 같은 것을 생각하고 있었지만 작동하지 않았다.

if ('.pdf' or '.doc' or '.xls') in url_string:
    print(url_string)

편집 : 나는 이것이 잠재적 중복으로 표시되는 아래 질문과 어떻게 다른지 설명해야합니다 (따라서 닫히지 않습니다).

차이점은 문자열이 문자열 목록의 일부인지 확인하고 다른 질문은 문자열 목록의 문자열이 다른 문자열의 하위 문자열인지 확인하는 것입니다. 온라인 IMHO에 대한 답변을 찾을 때 비슷하지만 의미가 중요하지 않습니다. 이 두 질문은 실제로 서로 반대되는 문제를 해결하려고합니다. 둘 다에 대한 해결책은 동일합니다.


답변:


420

와 함께 발전기를 사용 any하면 첫 번째 True에서 단락됩니다.

if any(ext in url_string for ext in extensionsToCheck):
    print(url_string)

편집 : 이 답변이 OP에 의해 수락 된 것으로 보입니다. 내 솔루션은 그의 특정 문제에 대한 "충분히 좋은"솔루션 일 수 있지만 목록의 문자열이 다른 문자열에 있는지 확인하는 좋은 일반적인 방법이지만 이것이이 솔루션의 모든 것임을 명심하십시오. 예를 들어 문자열의 끝에서 문자열이 발견되는 위치는 중요하지 않습니다 . URL의 경우와 마찬가지로 이것이 중요한 경우 @Wladimir Palant의 답변을 살펴 보거나 오 탐지 위험이 있습니다.


1
이것은 내가 찾던 것입니다. 내 경우에는 문자열의 어느 부분이 확장인지는 중요하지 않습니다. 감사합니다
pootzko 2016 년

좋은 제안. 이 예제를 사용하면 다음과 같은 인수가 잘 알려진 도움말 플래그와 일치하는지 확인하는 방법입니다. any ([ '-?', '-h', '-help', '/ h x] sys.argv [1 :]])
AX Labs

내부에서 목록 이해를 사용하는 @ AXE-Labs any는 전체 목록이 모든 경우에 구축되어야하기 때문에 단락이 제공하는 가능한 이점 중 일부를 무효화합니다. 대괄호 ( any(x.lower() in ['-?','-h','--help', '/h'] for x in sys.argv[1:])) 없이 표현식을 사용하는 경우 x.lower() in [...]True 값을 찾을 때까지 파트가 평가됩니다.
Lauritz V. Thaulow

5
그리고 any ()가 True를 반환 할 때 ext가 무엇인지 알고 싶다면?
피터 세나

@PeterSenna : true 또는 falseany() 만 반환 하지만이 수정을 통해 아래 @psun의 목록 이해 답변을 참조하십시오.print [extension for extension in extensionsToCheck if(extension in url_string)]
Dannid

45
extensionsToCheck = ('.pdf', '.doc', '.xls')

'test.doc'.endswith(extensionsToCheck)   # returns True

'test.jpg'.endswith(extensionsToCheck)   # returns False

5
이것은 영리합니다-튜플이 그렇게 할 수 있다는 것을 몰랐습니다!하지만 하위 문자열이 문자열의 한쪽 끝에 고정되어있을 때만 작동합니다.
대니얼

3
멋지다. 그냥 시작으로
끝나

@BrDaHa 당신은 contains에 'in'을 사용할 수 있습니다. 'string'이 목록에있는 경우 :
Shekhar Samanta

@ShekharSamanta는 확실하지만 여러 가지 중 하나가 문자열에 있는지 확인하는 문제를 해결하지 못합니다. 원래 질문에 관한 것입니다.
BrDaHa

예 그 경우에 우리가 사용할 수있는 경우 (사항 String.split의 요소 (목록의 요소 '어떤 delmiter')) 문자열 및있는 경우 (리스트의 요소의 문자열 요소)
Shekhar Samanta

21

당신이 처리 할 수있는이 방법 - 제대로 URL 구문 분석하는 것이 좋습니다 http://.../file.doc?foohttp://.../foo.doc/file.exe제대로을.

from urlparse import urlparse
import os
path = urlparse(url_string).path
ext = os.path.splitext(path)[1]
if ext in extensionsToCheck:
  print(url_string)

3

단일 회선 솔루션을 원할 경우 목록 이해를 사용하십시오. 다음 코드는 확장명이 .doc, .pdf 및 .xls 인 경우 url_string을 포함하는 목록을 반환하거나 확장명이 포함되지 않은 경우 빈 목록을 반환합니다.

print [url_string for extension in extensionsToCheck if(extension in url_string)]

참고 : 이것은 포함 여부를 확인하기위한 것이며 확장과 일치하는 정확한 단어를 추출하려고 할 때 유용하지 않습니다.


이것은 any솔루션 보다 더 읽기 쉽고 내 의견으로는 해당 질문에 가장 적합한 솔루션 중 하나입니다.
Dmitry Verhoturov

이 사람은 우수하다 any()그것과 같이,뿐만 아니라 특정 일치하는 값을 반환하도록 변경 될 수 있기 때문에 내 의견 솔루션 : print [extension for extension in extensionsToCheck if(extension in url_string)](추가 내용은 내 대답을 참조하는 방법과 일치하는 추출 단어를 URL_STRING에서 패턴뿐만 아니라)
Dannid

2

이 정규식과 일치하는지 확인하십시오.

'(\.pdf$|\.doc$|\.xls$)'

참고 : 확장명이 URL의 끝에 있지 않으면 $문자를 제거 하되 약간 약화 시킵니다.


1
URL입니다. 쿼리 문자열이 있으면 어떻게됩니까?
블라디미르 팔 런트

import re re.search (pattern, your_string)
juankysmith 2016 년

이 답변은 지정된 사례에 적용되지만 확장 가능하거나 일반적이지 않습니다. 일치시키려는 모든 패턴에 대해 긴 정규식이 필요합니다.
대니얼

1

이것은 @psun이 제공하는 목록 이해 답변의 변형입니다.

출력 값을 전환하면 실제로 목록 이해에서 일치하는 패턴을 추출 할 수 있습니다 ( any()@ Lauritz-v-Thaulow 의 방법으로 는 불가능 )

extensionsToCheck = ['.pdf', '.doc', '.xls']
url_string = 'http://.../foo.doc'

print [extension for extension in extensionsToCheck if(extension in url_string)]

[ '.doc']`

일치하는 패턴을 알고 나면 추가 정보를 수집하려는 경우 정규식을 추가로 삽입 할 수 있습니다 (허용 된 패턴 목록이 너무 길어서 단일 정규식 패턴에 쓸 수없는 경우에 유용 할 수 있음)

print [re.search(r'(\w+)'+extension, url_string).group(0) for extension in extensionsToCheck if(extension in url_string)]

['foo.doc']

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.