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
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 .
quelle
**
Platzhalter? (e-> Ich habe die Dokumente überprüft - es behandelt Schrägstriche nicht anders und daher ist der**
Platzhalter hier nicht einmal erforderlich).fnmatch
es "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 esfnmatch
unter 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
quelle
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.
quelle
fnmatch
Modul 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)
quelle
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)
quelle
Einfache Methode ist versuchen
os.system
:import os text = 'this is text' os.system("echo %s | grep 't*'" % text)
quelle