Как проверить, содержит ли строка элемент из списка в Python

У меня есть что-то вроде этого:

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

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

Мне интересно, что было бы более элегантным способом сделать это в Python (без использования цикла for)? Я думал о чем-то вроде этого (например, из C/C++), но это не сработало:

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

Редактировать: я вынужден объяснить, чем это отличается от приведенного ниже вопроса, который помечен как потенциальный дубликат (поэтому он не закрывается, я думаю).

Разница в том, что я хотел проверить, является ли строка частью какого-либо списка строк, тогда как другой вопрос - проверить, является ли строка из списка строк подстрокой другой строки. Подобное, но не совсем то же самое и семантика имеют значение, когда вы ищете ответ в Интернете ИМХО. Эти два вопроса на самом деле направлены на решение противоположной проблемы друг друга. Решение для обоих оказывается одинаковым, хотя.

Ответ 1

Используйте генератор вместе с any, который закорачивает первый True:

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

ОБНОВЛЕНИЕ: Я вижу, этот ответ был принят OP. Хотя моё решение может быть "достаточно хорошим" решением его конкретной проблемы, и это хороший общий способ проверить, найдены ли какие-либо строки в списке в другой строке, имейте в виду, что это все, что делает это решение. Неважно, где находится строка, например, в конце строки. Если это важно, как это часто бывает с URL-адресами, вам следует обратиться к ответу @Wladimir Palant, иначе вы рискуете получить ложные срабатывания.

Ответ 2

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

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

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

Ответ 3

Лучше правильно проанализировать URL-адрес - таким образом вы можете корректно обрабатывать http://.../file.doc?foo и http://.../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)

Ответ 4

Проверьте, соответствует ли это регулярное выражение:

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

Примечание: если вы не находитесь в конце URL-адреса, удалите символы $, но он слегка ослабит его

Ответ 5

Используйте списки, если хотите однострочное решение. Следующий код возвращает список, содержащий url_string, когда он имеет расширения .doc,.pdf и .xls или возвращает пустой список, если он не содержит расширение.

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

ПРИМЕЧАНИЕ. Это только для того, чтобы проверить, содержит ли оно или нет, и не полезно, когда требуется извлечь точное слово, соответствующее расширениям.

Ответ 6

Это вариант ответа на понимание списка, заданный @psun.

Переключив выходное значение, вы можете фактически извлечь соответствующий шаблон из понимания списка (что невозможно при использовании подхода any() by Lauritz-v-Thaulow)

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

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

[ 'документ'] `

Кроме того, вы можете вставить регулярное выражение, если хотите получить дополнительную информацию после того, как совпадающий шаблон известен (это может быть полезно, когда список разрешенных шаблонов слишком длинный для записи в один шаблон регулярного выражения)

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

['foo.doc']