繁体   English   中英

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

[英]How to extract all substrings between certain characters by using regular expression in Python?

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

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

其中$global表示Python中称为'settings'的某个字典。 我想将所有术语'$ global.key'替换为dict value 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相同的行数更改为词典中的相应值。 “ +”表示为“串联”。

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是一个函数,则在每次非重叠出现模式时都会调用它。 该函数采用单个match对象参数,并返回替换字符串。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM