我建議不要使用正則表達式完成這個任務,因爲你想解析的語言是不規則的。
您有一個多個鍵值對的字符串。解析這個問題的最好方法不是匹配它上的模式,而是正確地標記它。
Python標準庫中有一個模塊,名爲shlex
,它模仿POSIX shell所做的解析,並提供了一個可以根據需要輕鬆定製的詞法分析器實現。
from shlex import shlex
def parse_kv_pairs(text, item_sep=",", value_sep="="):
"""Parse key-value pairs from a shell-like text."""
# initialize a lexer, in POSIX mode (to properly handle escaping)
lexer = shlex(text, posix=True)
# set ',' as whitespace for the lexer
# (the lexer will use this character to separate words)
lexer.whitespace = item_sep
# include '=' as a word character
# (this is done so that the lexer returns a list of key-value pairs)
# (if your option key or value contains any unquoted special character, you will need to add it here)
lexer.wordchars += value_sep
# then we separate option keys and values to build the resulting dictionary
# (maxsplit is required to make sure that '=' in value will not be a problem)
return dict(word.split(value_sep, maxsplit=1) for word in lexer)
實例運行:
parse_kv_pairs(
'key1=value1,key2=\'value2,still_value2,not_key1="not_value1"\''
)
輸出:
{'key1': 'value1', 'key2': 'value2,still_value2,not_key1="not_value1"'}
編輯:我忘了補充一點,我通常shlex堅持,而不是使用常規的理由表達式(在這種情況下更快)是gi你不會感到驚訝,特別是如果你以後需要允許更多的投入。我從來沒有發現如何正確解析這些鍵值對與正則表達式,總會有輸入(例如:A="B=\"1,2,3\""
),將欺騙引擎。
如果你不關心這樣的輸入,(或換句話說,如果你能確保你的輸入遵循常規語言的定義),正則表達式是完全正確的。
EDIT2:split
有一個maxsplit
參數,這比使用split/slicing/joining要乾淨得多。感謝@cdlane的聲音輸入!
可以請您發佈預期的輸出嗎? –
第二個例子中'key2'的值是否包含引號?即在你的例子中,'key2'映射到''value2,still_value2「'或'」\「value2,still_value2 \」「'? – EvilTak