TL; DR;
我想以一种干净而有弹性的方式(类似于"\\."
)将"\."
这样的字符串(代表正则表达式)转换成sed 's/\\\\/\\/g'
,我不知道这是否可以虽然会破例)
由于我使用的是python3,因此无法选择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('\\\\', '\\')
的几种变体,
但没有运气
如果有人对如何解决这个问题有任何想法,我将不胜感激!我不喜欢这种特定的做事方式,也不愿意接受其他方法。
亲切的问候!
答案 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时,不会对字符串进行两次转义,因此您无需取消转义。