Python模板匹配

时间:2019-05-16 09:35:18

标签: python-3.x

我有一个包含如下条目的文件

foo: /mnt/scratch-8123/
bar: /mnt/scratch-1512/

,我希望能够在我的代码中编写如下所示的路径:

<SCRATCH:foo>/results/stdout.txt

这种想法是,由于映射是由系统维护的,因此用户可以参考其他用户的数据而不必知道他们的数据位于何处。

识别这种标签并提取标签的foo部分以使文件路径的这一部分可以被/mnt/scratch-8123替换的最干净的方法是什么?我知道这可以用正则表达式完成,所以我基本上是在寻找最简单的方法...

2 个答案:

答案 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"