Разбор мультиформатной строки с помощью регулярных выражений - PullRequest
2 голосов
/ 30 сентября 2019

Я пытаюсь разобрать:

"- ключ-ключ-имя-пары ключ = значение ключа =" значения "ключ =" значение "ключ my-key-gh =the-values ​​my-key-gh = "the no-values" "

Я хотел бы получить следующие строки взамен

  1. -key
  2. -key-name-pair
  3. ключ = значение
  4. ключ = "значения"
  5. ключ = "значение"
  6. ключ
  7. my-key-gh = the-values ​​
  8. my-key-gh = "no-values"

Я пробовал это регулярное выражение:

(-([a-z])+)? |((\w)+=(\w)+)|((\w)+="(.*)")|((\w)+='(.*?)')|(\w+-\w+)+

Что не так с моим выражением?

1 Ответ

0 голосов
/ 30 сентября 2019

Вы можете использовать

re.findall(r'''-?\w[\w-]*(?:=(?:"[^"]*"|'[^']*'|[^\s"']+))?''', text)

С поддержкой экранированных кавычек:

re.findall(r'''-?\w[\w-]*(?:=(?:"[^"\\]*(?:\\.[^"\\]*)*"|'[^'\\]*(?:\\.[^'\\]*)*'|[^\s"']+))?''', text)

См. Демонстрационную версию regex

Подробности

  • -? - необязательный дефис
  • \w[\w-]* - слово char с последующим 0+ словом или дефисом
  • (?:=(?:"[^"]*"|'[^']*'|[^\s"']+))? - anнеобязательная последовательность
    • = - знак равенства
    • (?:"[^"]*"|'[^']*'|[^\s"']+) - либо
      • "[^"]*" - строка между двойными кавычками, не имеющая двойных кавычек внутри
      • '[^']*' - строка между одинарными кавычками, не содержащая одинарных кавычек внутри
      • [^\s"']+ - 1+ символов, кроме пробелов, " и '.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...