2017-06-21 5 views
1

Ich habe folgendes Wörterbuch in PythonWörterbuch-Werte basierend auf Regex entfernen?

dict1 = {"key1": 2345, "key2": 356, "key3": 773, "key44": 88, "key333": 12, "key3X": 13} 

Ich mag Schlüssel löschen, die das Muster "xxx#" oder "xxx##" nicht folgen. Das heißt, drei Zeichen gefolgt von einer einstelligen Ganzzahl oder einer zweistelligen Ganzzahl. Im obigen Beispiel ist dies:

new_dict = {"key1": 2345, "key2": 356, "key3": 773, "key44": 88} 

Für eine oder zwei Tasten, die Art, wie ich ein neues Wörterbuch mit einer Liste Verständnis wäre schaffen würde:

small_dict = {k:v for k,v in your_dic.items() if v not in ["key333", "key3X"]} 

Doch wie würde ich Regex verwenden/andere String-Methoden, um diese Strings zu entfernen?

Getrennte Frage: Was ist, wenn es eine spezielle Ausnahme gibt, z.B. einen Schlüssel, den ich gerne Schlüssel genannt "helloXX" würde?

+4

Was haben Sie versucht, so weit? –

+0

@KevinMGranger Manuell suchen, wie ich es mit 'small_dict' gemacht habe. – ShanZhengYang

+0

Sie haben bereits gezeigt, wie Sie ein Wörterbuch basierend auf einer booleschen Bedingung filtern können, und Sie können es leicht ändern, um stattdessen eine Regex zu verwenden. –

Antwort

1

Dies sollte alle Schlüssel in Ihrem Beispiel sowie Ihren Ausnahmefall entspricht:

new_dict = {k:dict1[k] for k in dict1 if re.match('[^\d\s]+\d{1,2}$', k)} 

ein neues Beispiel dict mit Ausnahme darin verwenden:

>>> dict1 = {"key1": 2345, "key2": 356, "key3": 773, "key44": 88, "key333": 12, "key3X": 13, "hello13": 435, "hello4325": 345, "3hi33":3} 
>>> new_dict = {k:dict1[k] for k in dict1 if re.match('[^\d\s]+\d{1,2}$', k)} 
>>> print(new_dict) 
{'hello13': 435, 'key44': 88, 'key3': 773, 'key2': 356, 'key1': 2345} 
2

Sie einen regulären Ausdruck verwenden können 3 Buchstaben, gefolgt von einer oder zwei Ziffern, gefolgt direkt vom Ende der Zeichenkette ($):

>>> import re 
>>> small_dict = {k:v for k,v in dict1.items() if re.match('[a-z]{3}\d{1,2}$',k, re.IGNORECASE)} 
>>> small_dict 
{'key44': 88, 'key3': 773, 'key1': 2345, 'key2': 356} 

Beachten Sie, dass re.match am Anfang der Zeichenfolge nach der Regex sucht: "123key123" würde zum Beispiel nicht übereinstimmen.

Wenn es Ausnahmen gibt, können Sie sie hinzufügen, nachdem Sie die Schlüssel gefiltert haben. Wenn Sie es auf einmal tun:

small_dict = {k:v for k,v in dict1.items() if re.match('[a-z]{3}\d{1,2}$',k, re.IGNORECASE) or k in ["hello12", "hello34"]} 
+0

Die letzte Zeile war, worüber ich verwirrt war. Danke dafür! – ShanZhengYang

1

nur eine andere Variante:

import re 

dict1 = {"key1": 2345, "key2": 356, "key3": 773, "key44": 88, "key333": 12, "key3X": 13} 

rx = re.compile(r'^[A-Za-z]{3}\d{1,2}$') 

new_dict = {key: dict1[key] for key in dict1 if rx.search(key)} 
print(new_dict) 
# {'key44': 88, 'key3': 773, 'key1': 2345, 'key2': 356} 
Verwandte Themen