2017-10-28 11 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 

辞書に試合を変換:私が欲しいものPythonの正規表現私はDのために得ることである

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

は次のとおりです。

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

誰かが私が間違っているのかを指し示すことができますか?私はdictのために2つのフィールドしか必要としないので、私は年齢部分を書いていませんでした。

答えて

3

あなたは文字通り、それ以外のパターンがまたはとして解釈される一致する|をエスケープする必要があります。

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

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

速度にsplit方法に対する簡単なテストのための:

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はあなたに感謝します。私は知らなかった|撮影された。 |何をする|正規表現の意味ですか? –

+1

これは 'or'を意味し、' blah | foo'は例えば 'blah'や' foo'にマッチします。 – Psidom

+0

また、サイドの質問:時間の複雑さの観点から、これをより高速に使用しているか、string.splitを使用していて、dictを速く構築していますか? –

2

そのような単純な場合は、簡単なstr.split()アプローチを使用することがあります:

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

print(d) 

出力:

{'name': 'Bob', 'bday': '01012017'} 
関連する問題