Skip to main content
 首页 » 编程设计

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

2025年05月04日29birdshome

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

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) 

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.

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

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