1

我有数百行要解析。它们就像:

key1 = $global.path
key2 = prefix +$global.name
key3 = prefix + $default
key4 = prefix+$lib.id + $value + $args.id + ' some between ' + $global.title

where$global表示 Python 中的某个 dict,称为'settings'. 我想用 dict value 替换所有术语 '$global.key' settings['key']$lib并且$args类似于$global

如果只有$default没有'.',应该与$global.default

并且都'+', ' + ', '+ ', ' +'应该直接删除。

如何在 Python 中做到这一点?我可以用普通的 Python 做到这一点。但我认为使用正则表达式更好。所有都应该不区分大小写。

首先识别要查找的字典。拿到钥匙。然后获取字典中的值。最后用值替换占位符。

例如,settings['name']是' carl'。然后是一行:

key2 = prefix + $global.name

应改为:

key2 = prefixcarl

谢谢。任何帮助表示赞赏:)

==================================================== ===========

编辑:

我手头有: 1. $global、$lib、$args 的字典 2. 数百行。

我想得到什么:占位符的相同行数$some.some更改为字典中的相应值。并且“+”表示为“连接”。

4

1 回答 1

6

re.sub与功能性“替换”参数一起使用:

settings = {}
settings['name'] = 'carl'

key2 = "foo $global.name bar"

import re
print re.sub(r'\$(\w+)\.(\w+)', lambda m: settings[m.group(2)], key2)

如果 repl 是一个函数,则每次出现不重叠的模式时都会调用它。该函数采用单个匹配对象参数,并返回替换字符串。

这是一个支持多个字典(假设它们是全局定义的)和“默认”参数的版本:

 re.sub(r'\$(\w+)(\.(\w+))?', lambda m: globals()[m.group(1)][m.group(3) or 'default'], key2)

如果您的字典是在函数中定义的,那么它们不再属于该函数globals(),而是属于locals()该函数。您必须使用闭包来访问它们:

import re

def some_func():
    settings = {'result_dir':'dir'} 
    args = {'run_id':'id'} 

    vars = locals() 

    print re.sub(r'\$(\w+)(\.(\w+))?', lambda m: vars[m.group(1)][m.group(3)], '$settings.result_dir + $args.run_id')

some_func()

最后,如果字典在一个类中,您可以使用getattr(self)它们来访问它们:

class X(object):

    def __init__(self):
        self.settings = {'result_dir':'dir'} 
        self.args = {'run_id':'id'} 

    def some_method(self):
        print re.sub(r'\$(\w+)(\.(\w+))?', lambda m: getattr(self, m.group(1))[m.group(3)], '$settings.result_dir + $args.run_id')


X().some_method()
于 2012-06-15T06:48:55.287 回答