如何使用Python中的正则表达式提取某些字符之间的所有子字符串?

时间:2012-06-15 06:39:26

标签: python regex

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

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

其中$global代表Python中某个名为'settings'的dict。我想用dict值settings['key']替换所有术语'$ global.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的相同行数已更改为字典中的相应值。并且'+'表示为'连接'。

1 个答案:

答案 0 :(得分: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)

If repl is a function, it is called for every non-overlapping occurrence of pattern. The function takes a single match object argument, and returns the replacement string.

这是一个支持多个dicts的版本(假设它们是全局定义的)和'default'参数:

 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()