Как проверить, содержит ли строка элемент из списка в Python - PullRequest
163 голосов
/ 30 июня 2011

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

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)

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

Ответы [ 6 ]

314 голосов
/ 30 июня 2011

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

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

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

30 голосов
/ 30 июня 2011
extensionsToCheck = ('.pdf', '.doc', '.xls')

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

'test.jpg'.endswith(extensionsToCheck)   # returns False
17 голосов
/ 30 июня 2011

Лучше правильно проанализировать 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)
2 голосов
/ 25 апреля 2016

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

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

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

2 голосов
/ 30 июня 2011

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

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

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

1 голос
/ 08 ноября 2016

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

['. doc'] `

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

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

['foo.doc']

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...