Python正则表达式实现指定函数名替换(避免误替换与重复替换)
精准替换表达式中的函数名
要解决你遇到的问题——只替换作为函数名的or/and/xor,不碰变量中的子串、也不重复替换已修改内容,用re.sub配合合适的正则就能一次搞定,不需要循环。
核心思路
用**单词边界\b**确保匹配的是独立的函数名:只有当or/and/xor是一个独立单词(前面不是字母、数字、下划线),且紧跟左括号(时,才进行替换。这样既不会误替换var_or这类变量里的or,也不会匹配已经替换后的func_or中的or(因为func_or里的or前面是下划线,属于单词字符,\b不会触发匹配)。
完整代码
import re expression = "or(x) & and() | xor(and() & or())" # 定义函数名替换映射 func_mapping = { "or": "func_or", "and": "func_and", "xor": "func_xor" } # 正则模式:匹配独立的函数名+左括号 pattern = re.compile(r"\b(or|and|xor)\(") # 执行替换 processed_expr = pattern.sub(lambda match: f"{func_mapping[match.group(1)]}(", expression) print(processed_expr)
输出结果
func_or(x) & func_and() | func_xor(func_and() & func_or())
说明
- 正则
\b(or|and|xor)\(中,\b是单词边界,确保匹配的函数名是独立的;(or|and|xor)是捕获组,用来提取要替换的函数名;\(匹配紧跟的左括号,避免误替换单独出现的or(比如变量名)。 - 用lambda函数结合映射字典,能快速完成对应替换,逻辑清晰且易扩展(比如后续加新函数只需更新字典)。
- 无需你原代码中的循环逻辑,因为这个正则可以一次性处理所有嵌套的函数名,不管层级多少都能正确匹配。
内容的提问来源于stack exchange,提问作者lmriccardo
相关产品推荐
相关产品推荐

