如何在Python中通过正则表达式筛选导入指定前缀的变量?
嗨,我完全懂你的需求——你在script_load.py里定义了上百个变量,只想导入符合特定正则规则的(比如以COLOUR开头的那些),既不想一个个手动列出来,也不想用import *把所有变量都拉进来,避免命名冲突或者冗余。可惜Python的静态import语法确实不支持直接用正则表达式筛选导入内容,你之前写的from script_load import r'^COLOUR.+$'会触发语法错误,因为import语句只接受明确的变量名或者通配符*。
不过别担心,我们有几种可行的办法来实现你的需求:
方法一:在script_load.py中自动生成导出列表(推荐)
你可以在script_load.py的末尾加一段代码,自动收集符合正则规则的变量并赋值给__all__变量。Python的from module import *会严格遵循__all__里的列表导入变量,这样你用from script_load import *时,就只会导入你想要的变量了。
修改后的script_load.py:
import os import re from configparser import ConfigParser file = os.path.join(os.getcwd(), 'file.txt') fparser = ConfigParser() fparser.read(file) COLOUR_ONE = fparser.get("GENERAL", "Green") COLOUR_TWO = fparser.get("GENERAL", "Red") COLOUR_THREE = fparser.get("GENERAL", "Blue") BUILDING_ONE = fparser.get("GENERAL", "House") BUILDING_TWO = fparser.get("GENERAL", "School") BUILDING_THREE = fparser.get("GENERAL", "Supermarket") # 自动收集所有以COLOUR开头的变量到导出列表 __all__ = [name for name in dir() if re.match(r'^COLOUR.+$', name)]
对应的script_main.py写法:
from script_load import * def function(): print(COLOUR_ONE + COLOUR_TWO + COLOUR_THREE)
这样就只会导入以COLOUR开头的变量,不会把BUILDING相关的也带进来。之后如果要调整筛选规则,只要修改script_load.py里的正则表达式就行,非常灵活。
方法二:在script_main.py中动态筛选导入
如果你不想修改script_load.py,可以在script_main.py里动态导入整个模块,然后遍历模块的属性,把符合正则规则的变量注入到当前脚本的全局命名空间中:
修改后的script_main.py:
import re import script_load # 遍历script_load的所有属性,筛选符合规则的变量并注入当前全局空间 for name in dir(script_load): if re.match(r'^COLOUR.+$', name): globals()[name] = getattr(script_load, name) def function(): print(COLOUR_ONE + COLOUR_TWO + COLOUR_THREE)
这段代码会先导入整个script_load模块,然后逐个检查模块的属性名,把符合^COLOUR.+$规则的变量引用赋值到当前脚本的全局变量中,这样你之后就能直接使用COLOUR_ONE这类原变量了,完全不需要创建新变量。
补充:为什么你的原写法会报错?
再简单解释下:Python的import是静态语法,在代码执行前就会被解析,它不支持把动态表达式(比如正则字符串)作为导入的名称。所以你不能直接在import语句里写正则,必须用动态导入的方式或者提前定义好导出列表来实现筛选。
备注:内容来源于stack exchange,提问作者luisito_36

