我有数百行要解析。他们就像:
key1 = $global.path
key2 = prefix +$global.name
key3 = prefix + $default
key4 = prefix+$lib.id + $value + $args.id + ' some between ' + $global.title
其中 $global 表示 Python 中称为 'settings' 的某个字典。我想用字典值 settings['key'] 替换所有术语“$global.key”。 $lib 和$args 类似于$global。
如果只有 $default 而没有 '.',应该与 $global.default 相同
并且所有的'+', '+', '+', '+'都应该直接移除。
如何在 Python 中执行此操作?我可以用普通的 Python 来完成。但我认为最好使用正则表达式。所有的都应该不区分大小写。
首先要认清要查找的字典。拿到 key 。然后获取字典中的值。最后用值替换占位符。
例如,settings['name'] 是 'carl'。然后行:
key2 = prefix + $global.name
应该改为:
key2 = prefixcarl
谢谢。任何帮助表示赞赏:)
============================================= ==============
编辑:
我手头的东西: 1. $global, $lib, $args 的字典 2. 数百行。
我想得到的: 占位符 $some.some 的相同行数更改为字典中的相应值。 “+”表示为“连接”。
请您参考如下方法:
将 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)
这是一个支持多个字典(假设它们是全局定义的)和“默认”参数的版本:
re.sub(r'\$(\w+)(\.(\w+))?', lambda m: globals()[m.group(1)][m.group(3) or 'default'], key2)
如果您的字典是在函数中定义的,那么它们不再属于 globals(),而是属于该函数的 locals()。你必须使用 closure访问它们:
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()
