"Unescaping" 字符串中的反斜杠

"Unescaping" backslashes in a string

TL;DR;

我想将 "\." 之类的字符串(表示正则表达式)以干净且有弹性的方式转换为 "\."(类似于 sed 's/\\/\/g',我不知道是否这可能会在边缘情况下中断)
val.decode('string-escape') 不是一个选项,因为我使用的是 python3。

到目前为止我尝试了什么:

我确信我错过了一个相关的部分,因为字符串转义(和反转义)似乎是一个相当普遍和基本的问题,但我还没有找到解决方案 =/

全文:

我有一个像这样的 YAML 文件

- !Scheme
      barcode: _([ACGTacgt]+)[_.]
      lane: _L(\d\d\d)[_.]
      name: RKI
      read: _R(\d)+[_.]
      sample_name: ^(.+)(?:_.+){5}
      set: _S(\d+)[_.]
      user: _U([a-zA-Z0-9\-]+)[_.]
      validation: .*/(?:[a-zA-Z0-9\-]+_)+(?:[a-zA-Z0-9])+\.fastq.*
...

描述了一个 "Scheme" 对象。 'name' 键是一个标识符,其余描述正则表达式。

我希望能够从 YAML 中解析一个对象,所以我写了一个 from_yaml class 方法:

scheme = Scheme()
loaded_mapping = loader.construct_mapping(node)  # load yaml-node as dictionary WARNING! loads str escaped

# re.compile all keys except name, adding name as regular string and
# unescaping escaped sequences (like '\') in the process
for key, val in loaded_mapping.items():
    if key == 'name':
        processed_val = val
    else:
        processed_val = re.compile(val)  # backslashes in val are escaped
    scheme.__dict__[key] = processed_val

问题是 loader.construct_mapping(node) 加载反斜杠转义的字符串,因此正则表达式不再正确。

我尝试了 val.encode().decode('unicode-escape')val.replace('\\', '\') 的几种变体, 但运气不好

如果有人知道如何处理这个问题,我将不胜感激!我不喜欢这种特定的做事方式,并且愿意接受其他方法。

亲切的问候!

假设我有这个超级简单的 YAML 文件

lane: _L(\d\d\d)[_.]

并像这样用 PyYAML 加载它:

import yaml
import re

with open('test.yaml', 'rb') as stream:
    data = yaml.safe_load(stream)

lane_pattern = data['lane']
print(lane_pattern)

lane_expr = re.compile(data['lane'])
print(lane_expr)

那么结果正如人们所期望的那样:

_L(\d\d\d)[_.]
re.compile('_L(\d\d\d)[_.]')

解析 YAML 时不会对字符串进行双重转义,因此您无需取消转义。