我有一个包含如下条目的文件
foo: /mnt/scratch-8123/
bar: /mnt/scratch-1512/
,我希望能够在我的代码中编写如下所示的路径:
<SCRATCH:foo>/results/stdout.txt
这种想法是,由于映射是由系统维护的,因此用户可以参考其他用户的数据而不必知道他们的数据位于何处。
识别这种标签并提取标签的foo
部分以使文件路径的这一部分可以被/mnt/scratch-8123
替换的最干净的方法是什么?我知道这可以用正则表达式完成,所以我基本上是在寻找最简单的方法...
答案 0 :(得分:0)
在这里,您可以使用该函数获取字符串和路径列表,并且希望摆脱路径上的尾部斜杠,使事情变得简单。
#!/usr/bin/env python3
import re
def parse(string, paths):
needed_path = re.findall(r'<SCRATCH:(.*)>', string)[0]
found_path = re.findall(needed_path+r': (.*)', paths, flags=re.MULTILINE)[0]
return re.sub(r'<SCRATCH:(.*)>', found_path, string)
print(parse("<SCRATCH:foo>/results/stdout.txt", """
foo: /mnt/scratch-8123
bar: /mnt/scratch-1512
"""))
答案 1 :(得分:0)
我不确定这与您需要的匹配程度如何,但是一种简单的方法是使用named placeholders格式化字符串。
如果您将文件解析为格式为dict
path_mapping = {'foo': '/mnt/scratch-8123', 'bar': '/mnt/scratch-1512'}
请注意,我如何在此处删除结尾的
/
,以便在加入时不会出现两次
然后您可以将字符串构造为
rel_path = '{foo}/results/stdout.txt'
abs_path = rel_path.format(**path_mapping)
# "/mnt/scratch-8123/results/stdout.txt"