私はこの作業のために正規表現を使用しないことを助言する
、あなたが解析したい言語が規則的ではないからです。
複数のキー値のペアの文字列があります。これを解析する最良の方法は、パターンを一致させることではなく、適切にトークン化することです。
shlex
と呼ばれるPython標準ライブラリには、POSIXシェルによって行われる解析を模倣し、必要に応じて簡単にカスタマイズできるレクサーの実装を提供するモジュールがあります。
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"'}
EDIT:私は普通のshlexにこだわる理由というよりは、定期的に使用していることを追加するのを忘れ式(この場合は速い)は、gi後でより多くの入力を可能にする必要がある場合は、特に驚きは少ないと考えています。このようなキーと値のペアを正規表現で正しく解析する方法は決して見つけられませんでした。エンジンを騙す入力(例:A="B=\"1,2,3\""
)が常に存在します。
このような入力を気にしない場合(あるいは言い換えれば、入力が正規言語の定義に従うことを保証できる場合)、正規表現は完全にうまくいきます。
EDIT2:split
はmaxsplit
引数を持って、それが分割/スライス/入社より使いはるかにきれいです。彼の音声入力のために@cdlaneに感謝します!
期待される出力を投稿できますか? –
2番目の例の 'key2'の値に引用符が含まれているかどうかすなわち、あなたの例では、 'key2'は' 'value2、still_value2''または' '\" value2、still_value2 \ "" 'にマップされますか? – EvilTak