Mar*_*koC 6 python regex yaml pyyaml
我正在使用 yaml 文件来存储一些配置数据,包括一些我不想保留在代码中的(许多)正则表达式字符串。一切正常,除了当我尝试使用 搜索一些错误转义的管道字符时r'\\\|'。我尝试了 yaml 中的带引号、不带引号和文字字符串,但没有任何效果。Yaml 和 Python 字符串转义规则一起似乎共同保持字符串中反斜杠的数量均匀。我打开并加载文件
f=open(file_path, 'r', encoding='utf_8')
python_dict = yaml.load(f)
Run Code Online (Sandbox Code Playgroud)
我想重现
re.compile('\\\|')
Run Code Online (Sandbox Code Playgroud)
使用类似的东西
re.compile(python_dict['escaped-pipes'])
Run Code Online (Sandbox Code Playgroud)
Python 3.4 与 PyYAML。
在 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
Run Code Online (Sandbox Code Playgroud)
单引号标量有点类似于 Python 原始字符串的 YAML。
您的正则表达式中可能有其他字符可能会干扰 YAML 的语法。您可能想使用块标量,它将所有字符视为内容并通过缩进结束:
block: |-
\\\|
next block: |-
\\\|
Run Code Online (Sandbox Code Playgroud)
|启动一个文字块标量,-导致最后的换行符(在下一项之前)不是标量的一部分,这正是您想要的。