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

Python正则匹配外部AND条件异常,求修正方案

问题:无法正确识别外部{AND}块,误匹配内部嵌套的{AND}结构

原代码问题分析

原代码里的正则表达式r'(\{AND.*?\})'使用了非贪婪匹配,这种写法会在遇到第一个}时就停止匹配,导致把嵌套在外部{AND}里的内部{AND}块(比如输入里的第5-7行、第9-11行)当成独立的匹配结果,而不是把整个最外层的{AND}块(第1-14行)作为一个整体匹配。

非贪婪模式.*?无法处理嵌套的大括号结构,这是核心问题。

解决思路

Python的re模块支持递归正则表达式,可以用平衡组思路匹配成对的大括号,忽略内部嵌套结构。定义正则匹配{AND开头,然后匹配任意内容(包括内部嵌套大括号),直到找到对应的闭合},内部嵌套结构通过递归引用自身处理。

修改后的代码

import re

def count_conditions(input_str, listbox):
    electric_attributes = ['electric', 'batter', "power"]
    input_str = input_str.strip().replace('\r\n', '\n').replace('\r', '\n')
    # 递归正则匹配最外层{AND}块,忽略内部嵌套的{AND}/{OR}
    pattern = re.compile(r'\{AND(?:[^{}]|(?R))*\}', re.DOTALL)
    matches = re.findall(pattern, input_str)
    
    line_num = 1

    for match in matches:
        attrs_found = []
        words = re.findall(r'\b\w+\b', match)
        for word in words:
            for attr in electric_attributes:
                if attr in word.lower() and word not in attrs_found:
                    attrs_found.append(word)
                    
        if attrs_found:
            start_line = line_num
            end_line = line_num + len(match.splitlines()) - 1
            message = f"{len(attrs_found)} electrical attribute(s) found on lines {start_line}-{end_line} of AND condition: {', '.join(attrs_found)}"
        else:
            start_line = line_num
            end_line = line_num + len(match.splitlines()) - 1
            message = f"No electrical attribute(s) found on lines {start_line}-{end_line} of AND condition"
        listbox.insert("end", message)
        line_num += match.count('\n') + 1

正则说明

  • \{AND:匹配块的起始标记
  • (?:[^{}]|(?R))*:非捕获组,处理两种情况:
    • [^{}]:匹配非大括号的任意字符
    • (?R):递归引用整个正则,匹配内部嵌套的大括号结构(如{AND}或{OR}块)
  • \}:匹配块的闭合标记
  • re.DOTALL:让.匹配换行符,支持跨多行的完整块

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 12:53:25