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