2017-10-28 2 views
1
text = "Bob|19|01012017" 
pat = re.compile("(?P<name>.+)|.*|(?P<bday>.+)") #hopefully this regex is correct 
result = pat.match(text) 
d = result.groupdict() 
print d 

Was ich für d bekommen ist:Python Regex konvertieren Spiele zu einem Wörterbuch

{'bday': None, 'name': 'Bob|19|01012017'} 

Was ich will, ist:

{bday: "01012017", name: "Bob"} 

Kann jemand darauf hinweisen, was ich falsch mache? Ich brauche nur zwei Felder für das Diktat, also habe ich den Altersteil nicht geschrieben.

Antwort

3

Sie müssen | entkommen buchstäblich übereinstimmen sonst das Muster als interpretiert wird oder:

text = "Bob|19|01012017" 
pat = re.compile("(?P<name>.+)\|.*\|(?P<bday>.+)") 
result = pat.match(text) 
d = result.groupdict() 

d 
# {'bday': '01012017', 'name': 'Bob'} 

Ein schneller Test gegen split Methode von der Geschwindigkeit:

text = "Bob|19|01012017" 
pat = re.compile("(?P<name>.+)\|.*\|(?P<bday>.+)") 
​ 
def regex_to_dict(texts, pat): 
    return [pat.match(text).groupdict() for text in texts] 

regex_to_dict([text], pat) 
# [{'bday': '01012017', 'name': 'Bob'}] 

def split_to_dict(texts): 
    dd = [] 
    for text in texts: 
     name, _, bday = text.split('|') 
     dd.append({'bday': bday, 'name': name}) 
    return dd 

split_to_dict([text]) 
# [{'bday': '01012017', 'name': 'Bob'}] 

texts = [text] * 100000 

%timeit regex_to_dict(texts, pat) 
# 10 loops, best of 3: 119 ms per loop 

%timeit split_to_dict(texts) 
# 10 loops, best of 3: 58.6 ms per loop 
+0

OMG danke. Ich wusste es nicht wurde genommen. Was macht | in Regex bedeuten? –

+1

Es bedeutet 'oder', 'blah | foo' zum Beispiel passt zu' blah' oder 'foo'. – Psidom

+0

Auch Seitenfrage: in Bezug auf die zeitliche Komplexität, ist dies schneller oder verwendet string.split und dann das Diktat schneller bauen? –

2

Für so einfachen Fall können Sie einfach Ansatz verwenden:

text = "Bob|19|01012017" 
items = text.split('|') 
d = {'bday': items[-1], 'name': items[0]} 

print(d) 

Der Ausgang:

{'name': 'Bob', 'bday': '01012017'}