字符串中的“转义”反斜杠

时间:2020-03-06 18:49:30

标签: python python-3.x escaping pyyaml

TL; DR;

我想以一种干净而有弹性的方式(类似于"\\.")将"\."这样的字符串(代表正则表达式)转换成sed 's/\\\\/\\/g',我不知道这是否可以虽然会破例)
由于我使用的是python3,因此无法选择val.decode('string-escape')

到目前为止我尝试过的事情:

  • val.replace('\\\\', '\\')的变体
  • 查看了these two的答案 问题,但无法让他们在我的情况下工作
    • val.encode().decode('unicode-escape')的变体
  • 看过docs for strings,但 找不到解决方案

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

全文:

我有一个类似的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.*
...

描述一个“方案”对象。 “名称”键是一个标识符,其余的描述正则表达式。

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

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('\\\\', '\\')的几种变体, 但没有运气

如果有人对如何解决这个问题有任何想法,我将不胜感激!我不喜欢这种特定的做事方式,也不愿意接受其他方法。

亲切的问候!

1 个答案:

答案 0 :(得分:1)

假设我有这个超级简单的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时,不会对字符串进行两次转义,因此您无需取消转义。