如何使用正则表达式作为字典的键?

时间:2014-04-23 07:14:07

标签: python regex

我要使用python脚本处理文件。该文件是自动创建的,因此可以在键之前和之后添加一些字符。所以我想用正则表达式来匹配它们(中间部分总是相同的,它们有任何麻烦):

def dict(x):
 return{
  '.*key1.*': 'blabla',
  '.*key2.*': 'thing'
 }.get(x,'default')

这不起作用,因为".*"代表字符。

如何执行此操作?

2 个答案:

答案 0 :(得分:2)

或者,如何使用此RegexDict

class RegexDict(dict):
    import re
    def __init__(self, *args, **kwds):
        self.update(*args, **kwds)

    def __getitem__(self, required):
        for key in dict.__iter__(self):
            if self.re.match(key, required):
                return dict.__getitem__(self, key)
        return dict.__getitem__(self, key) # redundancy but it can handle exceptions.

regex_dict = RegexDict({'.*key1.*':'blabla', '.*key2.*':'thing'})

print regex_dict['foo_key1_bar'] # blabla
print regex_dict['foo_key2_bar'] # thing

答案 1 :(得分:1)

您需要自己匹配文件。 get无法为您做到这一点。

您想要的可能是

def get_content(filename):
    lookup = (
        (r'.*key1.*', 'blahblah',),
        (r'.*key2.*', 'thing',),
    )
    for pattern, content in lookup:
        if re.match(pattern, filename):
            return content

这里有很多可以优化的东西,但这个想法就在那里。


编辑:

正如mskimm和Grijesh Chauhan所指出的,问题中附带的代码还有两个需要指出的问题:

  • 不要将dict用作函数或变量名称,因为它是built-in type的名称。
  • 对于正则表达式模式,使用原始字符串文字(带有前缀r的文字,r'like this')而不是标准字符串文字('like this'),因为正则表达式模式使用需要经常逃避的字符。

本答案中的代码反映了以上两点。