You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Python正则验证表达式有效性,校验expand函数单参数

Python正则表达式验证表达式有效性(含expand函数参数限制)

我来分享一套针对你需求的Python正则验证方案——既要搞定括号匹配、算术运算合规,还得严格限制expand()函数只能传单个参数,完全贴合你的校验要求。

核心验证规则拆解

  • 括号数量严格匹配:所有(和)必须成对出现,不能有遗漏或多余
  • 算术运算符合规:仅允许+、-、*、/、**这类合法算术运算符,拒绝非法符号
  • 关键限制:expand()函数内部必须且仅存在1个参数,多参数直接判定为无效

实现代码及解析

import re

def validate_expression(expr):
    # 先做括号匹配校验(复杂嵌套场景用栈更准确,这里先给基础版+进阶版选项)
    # 基础版:计数校验
    # if expr.count('(') != expr.count(')'):
    #     return False
    
    # 进阶版:栈校验(支持复杂嵌套括号)
    def check_balance(expr_str):
        stack = []
        for char in expr_str:
            if char == '(':
                stack.append(char)
            elif char == ')':
                if not stack:
                    return False
                stack.pop()
        return len(stack) == 0
    
    if not check_balance(expr):
        return False
    
    # 正则核心规则:排除多参数expand,匹配合法表达式结构
    pattern = r"""
        ^(?!.*expand\s*\(\s*[^,]+?\s*,\s*.+?\s*\))  # 负向前瞻:只要expand里有逗号直接判无效
        (?:[a-zA-Z0-9_]+\s*[+\-*/]+\s*)*           # 前置合法算术运算片段
        (?:[a-zA-Z0-9_]+|expand\s*\(\s*[^,]+?\s*\)) # 允许变量/单参数expand
        (?:\s*[+\-*/]+\s*[a-zA-Z0-9_]+)*           # 后置合法算术运算片段
        $
    """
    # 启用注释模式+跨行匹配,让正则更易读
    return re.match(pattern, expr, re.VERBOSE | re.DOTALL) is not None

正则关键点说明

  • (?!.*expand\s*\(\s*[^,]+?\s*,\s*.+?\s*\)):这是负向前瞻断言,专门拦截expand()里包含逗号的多参数场景,是实现你核心要求的关键
  • 算术运算片段只允许合法标识符(字母、数字、下划线)和指定运算符组合,避免非法字符混入
  • 括号校验提供了基础计数和进阶栈实现两种选项,复杂嵌套场景优先用栈方案,准确性更高

测试用例示例

  • 有效表达式:
    • x + expand(y)
    • a * b - expand(foo_bar_123)
    • expand(456) / 789
  • 无效表达式:
    • x + expand(y, z)(多参数触发负向前瞻)
    • a + (b - c(括号不匹配)
    • x @ y(非法运算符)

内容的提问来源于stack exchange,提问作者Giordano

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 07:21:18