У меня есть что-то вроде этого:
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)
Редактировать: я вынужден объяснить, как это отличается от вопроса ниже, который помечен как потенциальный дубликат (так что, я думаю, он не закрывается).
Разница в том, что я хотел проверить, является ли строка частью какого-либо списка строк, тогда как другой вопрос - проверить, является ли строка из списка строк подстрокой другой строки. Похоже, но не совсем то же самое, и семантика имеет значение, когда вы ищете ответ онлайн ИМХО. Эти два вопроса на самом деле направлены на решение противоположной проблемы друг друга. Решение для обоих оказывается одинаковым, хотя.
источник
Ответы:
Вместе с генератором используйте генератор
any
, который замыкает первый True:РЕДАКТИРОВАТЬ: Я вижу, что этот ответ был принят OP. Хотя мое решение может быть «достаточно хорошим» решением его конкретной проблемы, и это хороший общий способ проверить, найдены ли какие-либо строки в списке в другой строке, имейте в виду, что это все, что делает это решение. Неважно, где находится строка, например, в конце строки . Если это важно, как это часто бывает с URL-адресами, вам следует обратиться к ответу @Wladimir Palant, иначе вы рискуете получить ложные срабатывания.
источник
any
, сведут на нет некоторые из возможных выгод, которые дает короткое замыкание, потому что весь список должен быть построен в каждом случае. Если вы используете выражение без квадратных скобок (any(x.lower() in ['-?','-h','--help', '/h'] for x in sys.argv[1:])
),x.lower() in [...]
часть будет оцениваться только до тех пор, пока не будет найдено значение True.any()
будет возвращать только true или false , но см. Приведенный ниже ответ @psun о понимании списка с этой модификацией:print [extension for extension in extensionsToCheck if(extension in url_string)]
источник
Лучше разобрать URL-адрес правильно - таким образом, вы можете справиться
http://.../file.doc?foo
иhttp://.../foo.doc/file.exe
правильно.источник
Используйте списки, если вы хотите однострочное решение. Следующий код возвращает список, содержащий строку url_string, если он имеет расширения .doc, .pdf и .xls, или возвращает пустой список, если он не содержит расширения.
ПРИМЕЧАНИЕ: это только для проверки, если оно содержит или нет, и бесполезно, когда нужно извлечь точное слово, соответствующее расширениям.
источник
any
решение, на мой взгляд, это одно из лучших возможных решений этого вопроса.any()
моему мнению, этот вариант превосходит решение, потому что его можно изменить, чтобы он также возвращал определенное значение соответствия, например так:print [extension for extension in extensionsToCheck if(extension in url_string)]
(см. Мой ответ для получения дополнительной информации и того, как извлечь соответствующее слово, а также шаблон из url_string)Проверьте, соответствует ли это регулярному выражению:
Примечание: если ваши расширения находятся не в конце URL, удалите
$
символы, но это немного ослабляет егоисточник
Это вариант ответа о понимании списка, заданного @psun.
Переключая выходное значение, вы можете фактически извлечь шаблон сопоставления из списка (что невозможно при
any()
подходе @ Lauritz-v-Thaulow)Кроме того, вы можете вставить регулярное выражение, если вы хотите собрать дополнительную информацию, как только сопоставленный шаблон известен (это может быть полезно, когда список разрешенных шаблонов слишком длинный для записи в один шаблон регулярного выражения)
источник