首页 > 解决方案 > 从 Yaml 文件中读取正则表达式字符串会使反斜杠加倍

问题描述

我正在尝试将正则表达式模式存储在 Yaml 文件中,如下所示:

---

Fidor:
  Fidor Rechnungsabschluss kurz:
    From: ^Rechnungsabschluss_(\d{2})_(\d{4})\.pdf
    To: \\2_\\1_Rechnungsabschluss_Fidor.pdf
  Fidor Rechnungsabschluss lang:
    From: ^Rechnungsabschluss_(\d{2})_(\d{4})_(\d+)\.pdf
    To: \\2_\\1_Rechnungsabschluss_Fidor_\\3.pdf

这就是我在 Python 中阅读它们的方式:

In [18]: # %load test.py
    ...: import yaml
    ...:
    ...: open("rename-patterns.yaml", 'r')
    ...:
    ...: stream = open("rename-patterns.yaml", 'r')
    ...: patterns = yaml.safe_load(stream)
    ...: print(patterns)
    ...:
{'Fidor': {'Fidor Rechnungsabschluss kurz': {'From': '^Rechnungsabschluss_(\\d{2})_(\\d{4})\\.pdf', 'To': '\\\\2_\\\\1_Rechnungsabschluss_Fidor.pdf'}, 'Fidor Rechnungsabschluss lang': {'From': '^Rechnungsabschluss_(\\d{2})_(\\d{4})_(\\d+)\\.pdf', 'To': '\\\\2_\\\\1_Rechnungsabschluss_Fidor_\\\\3.pdf'}}}

因此,每一个都\\\它们读入 Python 字典。

我试图将 Yaml 字符串放入'or ",但没有任何帮助。

我错过了什么?

编辑

即使使用|文字字符串(见 [1])也无济于事。

所以这

---

Fidor:
  Fidor Rechnungsabschluss kurz:
    From: |
      ^Rechnungsabschluss_(\d{2})_(\d{4})\.pdf
    To: |
      \\2_\\1_Rechnungsabschluss_Fidor.pdf
  Fidor Rechnungsabschluss lang:
    From: ^Rechnungsabschluss_(\d{2})_(\d{4})_(\d+)\.pdf
    To: \\2_\\1_Rechnungsabschluss_Fidor_\\3.pdf

\使用=>产生相同的 Python dict \\

{'Fidor': {'Fidor Rechnungsabschluss kurz':
           {'From': '^Rechnungsabschluss_(\\d{2})_(\\d{4})\\.pdf\n', 'To': '\\\\2_\\\\1_Rechnungsabschluss_Fidor.pdf\n'},
           'Fidor Rechnungsabschluss lang':
           {'From': '^Rechnungsabschluss_(\\d{2})_(\\d{4})_(\\d+)\\.pdf', 'To': '\\\\2_\\\\1_Rechnungsabschluss_Fidor_\\\\3.pdf'}}}

[1] https://pyyaml.org/wiki/PyYAMLDocumentation

编辑2:最终使用[0-9]+而不是\d+

由于我无法使其工作,我需要更改我的 yaml 文件以[0-9]+用于数字并防止使用反斜杠。

---

Fidor:
  Rechnungsabschluss kurz:
    From: ^Rechnungsabschluss_([0-9]{2})_([0-9]{4})[.]pdf
    To: \2_\1_Rechnungsabschluss_Fidor.pdf 
  Rechnungsabschluss lang:
    From: ^Rechnungsabschluss_([0-9]{2})_([0-9]{4})_([0-9]+)[.]pdf
    To: \2_\1_Rechnungsabschluss_Fidor_\3.pdf

标签: pythonyamlpyyaml

解决方案


'\' 在字符串文字中开始转义字符序列。换句话说,在字符串文字中,字符 '\' 和后面的字符表示单个字符。阅读更多关于字符串文字中的转义字符序列。

在您的示例中,“\\”用于表示字符“\”。


推荐阅读