Python Logic в поиске строки - PullRequest
3 голосов
/ 27 февраля 2011
filtered=[]
text="any.pdf"
if "doc" and "pdf" and "xls" and "jpg" not in text:
    filtered.append(text)
print(filtered)

Это моя первая публикация в переполнении стека, поэтому извините, если в Вопросе есть что-то раздражающее. Код предполагает добавить текст, если текст не содержит ни одного из этих слов: doc, pdf, xls, jpg. Он отлично работает, если его как:

if "doc" in text:
elif "jpg" in text:
elif "pdf" in text:
elif "xls" in text:
else:
    filtered.append(text)

Ответы [ 5 ]

6 голосов
/ 27 февраля 2011

Если вы откроете интерпретатор Python, вы обнаружите, что "doc" and "pdf" and "xls" and "jpg" - это то же самое, что и 'jpg':

>>> "doc" and "pdf" and "xls" and "jpg"
'jpg'

Таким образом, вместо того, чтобы проверять все строки, ваша первая попытка проверяет только 'jpg'.

Есть несколько способов сделать то, что вы хотите. Ниже приведено не самое очевидное, но это полезно:

if not any(test_string in text for test_string in ["doc", "pdf", "xls", "jpg"]):
    filtered.append(text)

Другой подход заключается в использовании цикла for в сочетании с оператором else:

for test_string in ["doc", "pdf", "xls", "jpg"]:
    if test_string in text:
        break
else: 
    filtered.append(text)

Наконец, вы можете использовать чистое понимание списка:

tofilter = ["one.pdf", "two.txt", "three.jpg", "four.png"]
test_strings = ["doc", "pdf", "xls", "jpg"]
filtered = [s for s in tofilter if not any(t in s for t in test_strings)]

EDIT

Если вы хотите отфильтровать как слова, так и расширения, я бы порекомендовал следующее:

text_list = generate_text_list() # or whatever you do to get a text sequence
extensions = ['.doc', '.pdf', '.xls', '.jpg']
words = ['some', 'words', 'to', 'filter']
text_list = [text for text in text_list if not text.endswith(tuple(extensions))]
text_list = [text for text in text_list if not any(word in text for word in words)]

Это все еще может привести к некоторым несоответствиям; вышеприведенное также фильтрует «Сделай что-нибудь», «Он - мастер слов» и т. д. Если это проблема, то вам может потребоваться более сложное решение.

4 голосов
/ 27 февраля 2011

Если эти расширения всегда в конце, вы можете использовать .endswith, и это может анализировать кортеж.

if not text.endswith(("doc", "pdf", "xls", "jpg")):
    filtered.append(text)
3 голосов
/ 27 февраля 2011
basename, ext = os.path.splitext(some_filename)
if not ext in ('.pdf', '.png'):
   filtered.append(some_filename)
....
1 голос
/ 27 февраля 2011

Выбранный в настоящее время ответ очень хорош для объяснения синтаксически правильных способов сделать то, что вы хотите . Однако очевидно, что вы имеете дело с расширениями файлов, которые появляются на end [fail: doctor_no.py, whatsupdoc], и вероятно, что вы используете Windows, где различия регистра в путях файлов не существует [сбой: FUBAR.DOC].

Чтобы охватить эти базы:

# setup
import os.path
interesting_extensions = set("." + x for x in "doc pdf xls jpg".split())

# each time around
basename, ext = os.path.splitext(text)
if ext.lower() not in interesting_extensions:
    filtered.append(text)
1 голос
/ 27 февраля 2011

Попробуйте следующее:

if all(substring not in text for substring in ['doc', 'pdf', 'xls', 'jpg']):
     filtered.append(text)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...