Как получить р '\\\ |'из файла yaml - PullRequest
0 голосов
/ 20 сентября 2018

Я использую файл yaml для хранения некоторых данных конфигурации, включая некоторые (многие) строки регулярных выражений, которые я не хочу хранить в коде.Все работает, за исключением случаев, когда я пытаюсь найти некоторые неправильно экранированные символы канала с r'\\\|'.Я пробовал цитаты, без кавычек и буквальные строки в yaml, ничего не работает.Правила экранирования строк в Yaml и Python, похоже, помогают сохранить количество обратных слэшей в строке.Я открываю и загружаю файл с

f=open(file_path, 'r', encoding='utf_8')
python_dict = yaml.load(f)

Я хочу воспроизвести

re.compile('\\\|')

, используя что-то вроде

re.compile(python_dict['escaped-pipes'])

Python 3.4 с PyYAML.

1 Ответ

0 голосов
/ 20 сентября 2018

В YAML \ является специальным символом только в строках с двойными кавычками.Строка Python r'\\\|' является необработанной строкой, поэтому она состоит из трех обратных косых черт и канала.У вас есть следующие опции для кодирования этого в YAML-документе:

plain:  \\\|      # plain scalar. YAML does not process the backslashes.
single: '\\\|'    # single quoted scalar. YAML also does not process the backslashes.
double: "\\\\\\|" # double quoted scalar. YAML does process escape sequences here, so you
                  # need to double the backslashes

Скаляры в одинарных кавычках являются своего рода YAML-эквивалентом необработанных строк Python.

Возможно, у вас есть другие символы вваши регулярные выражения, которые могут мешать синтаксису YAML.Вместо этого вы можете использовать блочные скаляры, которые обрабатывают все символов как содержимое и заканчиваются отступом:

block: |-
  \\\|
next block: |-
  \\\|

| запускает буквальный блочный скаляр , - заставляет окончательный разрыв строки (перед следующим элементом) не быть частью скаляра, а это то, что вам нужно.

...