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
相关产品推荐
相关产品推荐

