Nehmen wir an, ich habe eine Liste
list = ['this','is','just','a','test']
Wie kann ich einen Benutzer eine Platzhaltersuche durchführen lassen?
Suchwort: 'th_s'
Würde "dies" zurückgeben
Antworten:
Reguläre Ausdrücke sind wahrscheinlich die einfachste Lösung für dieses Problem:
import re
regex = re.compile('th.s')
l = ['this', 'is', 'just', 'a', 'test']
matches = [string for string in l if re.match(regex, string)]
Verwendung fnmatch:
import fnmatch
lst = ['this','is','just','a','test']
filtered = fnmatch.filter(lst, 'th?s')
Wenn Sie _als Platzhalter zulassen möchten , ersetzen Sie einfach alle Unterstriche durch '?'(für ein Zeichen) oder *(für mehrere Zeichen).
Wenn Sie möchten, dass Ihre Benutzer noch leistungsfähigere Filteroptionen verwenden, sollten Sie ihnen erlauben, reguläre Ausdrücke zu verwenden .
**Platzhalter? (e-> Ich habe die Dokumente überprüft - es behandelt Schrägstriche nicht anders und daher ist der **Platzhalter hier nicht einmal erforderlich).
fnmatches "Unix Filename Pattern Matching". Aber ich habe es gerade versucht und es scheint unter Windows zu funktionieren. Ist dieses glückliche undefinierte Verhalten oder wird es fnmatchunter Windows unterstützt?
Sie können das fnmatch- Modul ausprobieren , es hat eine Shell-ähnliche Platzhalter-Syntax
oder können reguläre Ausdrücke verwenden
import re
Meinen Sie eine bestimmte Syntax für Platzhalter? *Steht normalerweise für "ein oder mehrere" Zeichen und ?steht für eines.
Der einfachste Weg besteht wahrscheinlich darin, einen Platzhalterausdruck in einen regulären Ausdruck zu übersetzen und diesen dann zum Filtern der Ergebnisse zu verwenden.
fnmatchModul hat eine Funktion, um Platzhalter-Übereinstimmungen in reguläre Ausdrücke zu übersetzen:fnmatch.translate
Dieselbe Idee wie Yuushi bei der Verwendung regulärer Ausdrücke, verwendet jedoch die Findall-Methode in der Bibliothek anstelle eines Listenverständnisses:
import re
regex = re.compile('th.s')
l = ['this', 'is', 'just', 'a', 'test']
matches = re.findall(regex, string)
Warum benutzt du nicht einfach die Join-Funktion? In einem regulären Ausdruck findall () oder group () benötigen Sie eine Zeichenfolge, also:
import re
regex = re.compile('th.s')
l = ['this', 'is', 'just', 'a', 'test']
matches = re.findall(regex, ' '.join(l)) #Syntax option 1
matches = regex.findall(' '.join(l)) #Syntax option 2
Mit der Funktion join () können Sie eine Liste in eine Zeichenfolge umwandeln. Das einfache Anführungszeichen vor dem Beitritt wird in die Mitte jeder Zeichenfolge in der Liste eingefügt. Wenn Sie diesen Codeteil ('' .join (l)) ausführen, erhalten Sie Folgendes:
"Dies ist nur ein Test"
Sie können also die Funktion findal () verwenden.
Ich weiß, dass ich 7 Jahre zu spät bin, aber ich habe kürzlich einen Account erstellt, weil ich studiere und andere Leute die gleiche Frage haben könnten. Ich hoffe das hilft dir und anderen.
Update nach @ FélixBrunet Kommentare:
import re
regex = re.compile(r'th.s')
l = ['this', 'is', 'just', 'a', 'test','th','s', 'this is']
matches2=[] #declare a list
for i in range(len(l)): #loop with the iterations = list l lenght. This avoid the first item commented by @Felix
if regex.findall(l[i]) != []: #if the position i is not an empty list do the next line. PS: remember regex.findall() command return a list.
if l[i]== ''.join(regex.findall(l[i])): # If the string of i position of l list = command findall() i position so it'll allow the program do the next line - this avoid the second item commented by @Félix
matches2.append(''.join(regex.findall(l[i]))) #adds in the list just the string in the matches2 list
print(matches2)
Einfache Methode ist versuchen os.system:
import os
text = 'this is text'
os.system("echo %s | grep 't*'" % text)