代码之家  ›  专栏  ›  技术社区  ›  stgatilov

重新将模板转换为函数

  •  3
  • stgatilov  · 技术社区  · 5 年前

    我在用 re.sub 用字符串中的GLSL样式的名称替换ARB样式的名称。现在我想另外将所有转换的匹配项存储为一组字符串。我可以在使用 ?

    代码如下:

    # set of replacement rules
    expl_table = [
        (r'program.env\[(\d+)\]'  , r'program_env_\1'),
        (r'program.local\[(\d+)\]', r'program_local_\1'),
    ]
    for props in expl_table:
        (re_from, re_to) = props
        # arg = re.sub(re_from, re_to, arg)       # simple and good
        def replace_func(m):
            result = ??repl_template??(m, re_to)  # where can I find it?
            declarations.append(result)           # want to save all replacements
            return result
        arg = re.sub(re_from, replace_func, arg)
    

    _subx 在里面 source code 似乎我得自己去实现它,尽管听起来很愚蠢。

    1 回复  |  直到 5 年前
        1
  •  1
  •   Jan    5 年前

    您可以在使用 re.finditer() :

    # set of replacement rules
    expl_table = [
        (r'program.env\[(\d+)\]'  , r'program_env_dsdsds\1'),
        (r'program.local\[(\d+)\]', r'program_local_\1'),
    ]
    
    declarations = []
    for props in expl_table:
        (re_from, re_to) = props
    
        offset = 0
        for m in re.finditer(re_from, string):
            sub = m.expand(re_to)
    
            string = string[:m.start()+offset] + sub + string[m.end()+offset:]
            offset = max(map(len, [sub, m.group(0)])) - min(map(len, [sub, m.group(0)]))
            declarations.append(sub)
    
    print(string)
    

    或者,可以“升级”同一范围内的lambda函数。通常,不允许在lambda函数中使用多个语句,但是列表理解稍微绕过了这个约束:

    for props in expl_table:
        (re_from, re_to) = props
        string = re.sub(re_from,
                    lambda m: [
                               (result, declarations.append(result)) 
                               for result in [m.expand(re_to)]
                              ][0][0],
                     string)
    
    print(string)
    print(declarations)