3 votes

Logique Python dans la recherche d'une chaîne de caractères

filtered=[]
text="any.pdf"
if "doc" and "pdf" and "xls" and "jpg" not in text:
    filtered.append(text)
print(filtered)

C'est mon premier post sur Stack Overflow, donc excusez moi s'il y a quelque chose d'ennuyeux dans la question, Le code suppose d'ajouter du texte si le texte n'inclut aucun de ces mots:doc,pdf,xls,jpg. Il fonctionne bien si c'est comme ça :

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

6voto

senderle Points 41607

Si vous ouvrez un interpréteur python, vous constaterez que "doc" and "pdf" and "xls" and "jpg" est la même chose que 'jpg' :

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

Ainsi, au lieu de tester toutes les chaînes de caractères, votre première tentative ne teste que "jpg".

Il y a plusieurs façons de faire ce que vous voulez. La méthode ci-dessous n'est pas la plus évidente, mais elle est utile :

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

Une autre approche consisterait à utiliser un for en conjonction avec une boucle else déclaration :

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

Enfin, vous pouvez utiliser une compréhension de liste pure :

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)]

EDITAR :

Si vous souhaitez filtrer à la fois les mots et les extensions, je vous recommande ce qui suit :

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)]

Cela peut encore conduire à certaines inadéquations ; le filtre ci-dessus filtre également "Faites quelque chose", "C'est un orfèvre", etc. Si cela pose un problème, vous aurez peut-être besoin d'une solution plus complexe.

4voto

YOU Points 44812

Si ces extensions se trouvent toujours à la fin, vous pouvez utiliser .endswith et qui peut analyser les tuple.

if not text.endswith(("doc", "pdf", "xls", "jpg")):
    filtered.append(text)

3voto

Andreas Jung Points 1
basename, ext = os.path.splitext(some_filename)
if not ext in ('.pdf', '.png'):
   filtered.append(some_filename)
....

1voto

Essayez ce qui suit :

if all(substring not in text for substring in ['doc', 'pdf', 'xls', 'jpg']):
     filtered.append(text)

1voto

John Machin Points 39706

La réponse actuellement sélectionnée est très bonne en ce qu'elle explique les manières syntaxiquement correctes de faire ce que vous faites. vouloir à faire. Cependant, il est évident que vous avez affaire à des extensions de fichiers, qui apparaissent au niveau du nom de l'utilisateur. fin [échouer : doctor_no.py , whatsupdoc ], et il est probable que vous utilisiez Windows, où les distinctions entre majuscules et minuscules dans les chemins d'accès aux fichiers n'existent pas [fail : FUBAR.DOC ].

Pour couvrir ces bases :

# 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)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X