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] 删除。
我来说两句