Регулярные выражения отлично подходят для вещей, которые действуют как lexemes, что не так хорошо для синтаксического анализа общего назначения.
В этом случае, однако, это выглядит как ваша «Конфигурация-й строка» может состоять только из последовательности лексем вида: слова=
значения [,
слово=
значения ...]. Если это так, вы можете использовать регулярное выражение и повторение. Правильное регулярное выражение зависит от точного вида слова и значение, хотя (и в меньшей степени, хотите ли вы проверить наличие ошибок). Например, есть:
this="a string with spaces", that = 42, quote mark = "
разрешено, или нет? Если это так, то this
установлен на a string with spaces
(без кавычек) или "a string with spaces"
(включает в себя кавычки)? Is that
установлен на 42
(у которого есть ведущий пробел) или только 42
(что нет)? Разрешен ли quote mark
(который имеет встроенные пространства) и установлен ли он на одну метку двойной кавычки? Есть ли двойные кавычки, если он присутствует, «бежать» запятые, так что вы можете написать:
greeting="Hello, world."
Предполагая, что пространства запрещены, а слово и значение части просто «буквенно-цифровые, как совпадающая по \w
»:
for word, value in re.findall(r'([\w]+)=([\w]+)', string):
print word, value
это ясно из значения 102.201.333
что \w
не является достаточной для value
матча, хотя. Если значение является «все не запятая» (который включает в себя пробелы), затем:
for word, value in re.findall(r'([\w]+)=([^,]+)', string):
print word, value
становится ближе. Все они игнорируют «мусор» и запрещают пробелы вокруг знака =
. Если string
является "$a=this, b = that, c=102.201.333,,"
, второй печатает for
цикл:
a this
c 102.201.333
Доллар-знак (не алфавитно-цифровой символ) игнорируется, значение b
игнорируется из-за белого пространства, и две запятые после значения для c
также игнорируются.
Ну мой UseCase и проще, и сложнее, чем это: Его проще, потому что: * property1, свойство2 (т.е. слово) известен и зашит * Я могу жить с некоторым количеством ошибок Это трудно, потому что * Значение может быть сложным (weirdbar [345, weirderbar [123]]) – SANDeveloper
Я понял, что я пытаюсь сделать больше Deseriazlization, чем разбора регулярных выражений. Поэтому я вообще перехожу к другому подходу. Но я буду отмечать ваше решение как ответ за то, что он самый полный. – SANDeveloper