2017-04-18 110 views
-3

我需要將此字符串拆分爲字典,看起來像這樣。請注意,字符串中的鍵的順序可能不一樣。Python正則表達式通用解決方案

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作爲鍵和值對的列表。然後我們讓解析器做它的事情。

編輯:但我想,如果你真的想要一個正則表達式的解決方案...

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 –