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

芬恩

TL; DR;

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

到目前为止我尝试过的是:

  • 的变化 val.replace('\\\\', '\\')
  • 看着 两个问题的答案,但在我的情况下却无法解决
    • 的变化 val.encode().decode('unicode-escape')
  • 看过文档中的字符串,但是找不到解决方案

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

全文:

我有一个像这样的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('\\\\', '\\'),但是没有运气

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

亲切的问候!

托玛拉克

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章