Python模块内使用re模块报错:NameError: name 're' is not defined
问题分析与解决
你遇到的NameError: name 're' is not defined错误,根源出在模块导入方式上,咱们一步步拆解清楚:
为什么会报错?
你的代码开头写的是:
from re import *
这种导入方式会把re模块里的所有公共成员(比如search、sub函数)直接导入当前命名空间,但不会把re这个模块对象本身导入。
而在build_match_and_apply_functions函数里,你调用的是:
return re.search(pattern, word)
这里试图通过re这个模块名来访问search函数,但因为你用了from re import *,当前命名空间里根本没有re这个名字,自然就会抛出NameError。
至于你说把import re放进pluralize函数内也无效,那是因为matches_rule函数的作用域问题——它是在build_match_and_apply_functions里定义的,不会继承pluralize函数内的re导入,所以还是找不到。
两种可行的修复方案
方案1:直接使用导入的函数(不依赖模块名)
既然已经用from re import *导入了所有成员,那直接调用search和sub即可,不用加re.前缀:
def build_match_and_apply_functions(pattern, search, replace): def matches_rule(word): return search(pattern, word) # 去掉re.前缀 def apply_rule(word): return sub(search, replace, word) # 去掉re.前缀 return (matches_rule, apply_rule)
方案2:改用标准的模块导入方式
更推荐这种方式,代码可读性更强,也不容易出现命名冲突:
把开头的from re import *改成:
import re
这样整个代码里的re.search和re.sub调用就都能正常工作了,不需要修改其他函数内的代码。
验证修复效果
修复后,运行你的测试代码:
import pluralizer funcs = pluralizer.LazyRules() p = pluralizer.pluralize("baby", funcs) print(p) # 会输出预期的"babies"
内容的提问来源于stack exchange,提问作者P. Prunesquallor
相关产品推荐
相关产品推荐

