나는이 작업을 위해 정규 표현식을 사용하여 무리를 줄 것이다
, 구문 분석하려는 언어가 규칙적이 아니기 때문입니다.
여러 키 값 쌍의 문자열이 있습니다. 이것을 파싱하는 가장 좋은 방법은 패턴을 일치시키는 것이 아니라 올바르게 토큰 화하는 것입니다.
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"\''
)
출력 : 내가 추가하는 것을 잊었다 그 난 보통 정기적으로 사용하는 대신 shlex을 고수하는 이유 :
{'key1': 'value1', 'key2': 'value2,still_value2,not_key1="not_value1"'}
편집 표현식 (이 경우 더 빠름)은 gi 나중에 더 많은 입력을 허용해야하는 경우 특히 놀라움이 적습니다. 그런 키 - 값 쌍을 정규 표현식으로 올바르게 구문 분석하는 방법을 찾지 못했습니다. 엔진을 속일 입력 (예 : A="B=\"1,2,3\""
)이 항상 있습니다.
이러한 입력에 신경 쓰지 않는다면 (또는 다른 말로하면, 입력이 정규 언어의 정의를 따르도록 할 수 있다면) 정규 표현식은 완벽합니다.
EDIT2 :split
는 훨씬 더 분할/슬라이스/가입보다 사용하기 청소기하는 maxsplit
인수가 있습니다. 그의 소리 입력을위한 @cdlane에 감사드립니다!
예상 출력을 게시 할 수 있습니까? –
두 번째 예제의'key2' 값에 따옴표가 포함되어 있습니까? 즉, 당신의 예제에서'key2'는''value2, still_value2'' 또는''\ "value2, still_value2 \" "'에 매핑됩니까? – EvilTak