2017-04-18 5 views
-3

このような文字列を辞書に分割して、このような文字列を表示する必要があります。文字列内のキーの順序は同じではないことに注意してください。Python Regexジェネリックソリューション

String = 'Specialty: "Neurology: Neurology, NeuroScience", Profession: Nurse Practitioner, Source: TestSource' 

Dict = { 'Specialty': "Neurology: Neurology, NeuroScience", 'Profession': 'Nurse Practitioner', 'Source': 'TestSource' } 

この問題に対する正規表現の解決方法は非常に高く評価されます。

答えて

1

は最も簡単にはpyparsingpip install pyparsing)のように、適切なパーサで次のようになります。

from pyparsing import * 

text = 'Specialty: "Neurology: Neurology, NeuroScience", Profession: Nurse Practitioner, Source: TestSource' 

word = Word(alphas) 
key = word + Suppress(':') 
words = Combine(word + ZeroOrMore(" " + word)) 
value = (QuotedString('"')^words) + Optional(Suppress(', ')) 

dictionary = dictOf(key, value) 

print dictionary.parseString(text).asDict() 
# => {'Source': 'TestSource', 'Profession': 'Nurse Practitioner', 'Specialty': 'Neurology: Neurology, NeuroScience'} 

我々は一連のwordを定義する文法を定義します文字であるkeyの後にコロンが続きます(考慮しません)。wordsは、単語がスペースで区切られた単語を多く含む可能性があります。value単語や二重引用符で囲まれた文字列(おそらくカンマで終わっていないもの)と、dictionaryをキーと値のペアのリストとして指定します。それからパーサーにそのことをさせてください。

EDIT: `:しかし、あなたが本当に正規表現のソリューションをしたい場合、私は推測する...

print {m[0]: m[1] or m[2] 
    for m in re.findall(r'([^,:\s]+): (?:"([^"]*)"|([^,]+))', text)} 
+0

正規表現を使用して迅速かつ効率的な応答をありがとう。あなたが書いたことを理解できるようにタグを付けることができる参考文献はありますか? –

+0

答えに説明するのはちょっと複雑です。 https://regex101.com/r/zIPZcE/2は、右側に色分けされた素敵な内訳を表示します。 – Amadan

0

あなたがこの方法を移動する必要があります。

def create_dict(string, splitter=',', dict_splitter=':'): 
    _dict = {} 

    temp = ([s for s in string.split(splitter)]) 

    for item in temp: 
     key = item.split(dict_splitter)[0] 
     value = item.split(dict_splitter)[1] 
     _dict[key] = value 

    return _dict 

string = 'Specialty: "Neurology; Neurology NeuroScience", Profession: Nurse Practitioner, Source: TestSource' 

_dict = create_dict(string) 

for k, v in _dict.items(): 
    print(k, '\t', v) 


# Output must be like this 

# Specialty "Neurology; Neurology NeuroScience" 
# Profession Nurse Practitioner 
# Source  TestSource 
+0

あなただけの任意'「神経内科、ニューロサイエンス神経学」にカンマがあるという事実を無視することはできません。 – Amadan

+0

@Amadan、ええ、そういうわけで私はこのように移動するように言いました。良い答えbtw –