Как проверить, содержит ли строка элемент из списка в 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)

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

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

6 ответов


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

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

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


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

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

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

лучше правильно разобрать 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)

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

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

Примечание: Если вы расширения не в конец url, удалить $ символы, но это немного ослабляет его


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

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

Примечание: это только для того, чтобы проверить, содержит ли он или нет и не полезно, когда один хочет извлечь точное слово, соответствующее расширения.


это вариант ответа на понимание списка, данного @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']