Python 3.11正则表达式反转功能故障求助
问题分析与解决方案
问题描述
实现Python正则表达式反转功能时,括号处理逻辑失效:
- 输入文本:
dogs and cats or (white or black) or (cat and (red or blue)) - 正确正向正则:
dogs.{0,10}cats|(white|black)|(cat.{0,10}(red|blue)) - 当前错误反转结果:
))blue|red(.{0,10}cat(|)black|white(|cats.{0,10}dogs - 预期反转结果:
(blue|red).{0,10}cat|(black|white)|cats.{0,10}dogs
原代码问题点
- 正则拆分逻辑错误:拆分正则时未区分顶级分支与括号内的子表达式,导致括号被拆分为独立元素,破坏结构完整性。
- 括号内反转逻辑混乱:
reverse_inside_parentheses函数的栈处理逻辑错误,颠倒了括号的位置((和)顺序反转),且未正确处理嵌套括号的内容反转。 - 整体反转顺序错误:直接反转拆分后的所有元素列表,导致正则结构彻底混乱。
修复后的代码
import re import os def normalize_special_terms(text): text = re.sub(r'\bli[\s-]?6\b', r'\\bli[-\\s]?6\\b', text, flags=re.IGNORECASE) return text def reverse_regex_branch(branch): """反转单个正则分支的内容,处理括号和间隔符""" # 用栈处理嵌套括号,提取所有括号块和非括号块 parts = [] stack = [] current = [] for char in branch: if char == '(': if stack: current.append(char) else: if current: parts.append(''.join(current)) current = [] stack.append(char) elif char == ')': stack.pop() if not stack: current.append(char) parts.append(''.join(current)) current = [] else: current.append(char) else: current.append(char) if current: parts.append(''.join(current)) # 处理每个部分:括号块递归反转内部,非括号块直接反转 reversed_parts = [] for part in parts: if part.startswith('(') and part.endswith(')'): # 递归反转括号内的内容,保留括号结构 inner_reversed = reverse_regex_branch(part[1:-1]) reversed_parts.append(f'({inner_reversed})') else: # 非括号部分,按间隔符拆分后反转顺序 sub_parts = re.split(r'(\.\{0,\d+\})', part) sub_parts.reverse() reversed_parts.append(''.join(sub_parts)) # 合并所有处理后的部分,反转整个分支的顺序 reversed_parts.reverse() return ''.join(reversed_parts) def reverse_regex_order(regex): """反转整个正则表达式,处理顶级|分隔的分支""" # 拆分顶级分支(忽略括号内的|) branches = [] stack = [] current = [] for char in regex: if char == '(': stack.append(char) current.append(char) elif char == ')': stack.pop() current.append(char) elif char == '|' and not stack: branches.append(''.join(current)) current = [] else: current.append(char) if current: branches.append(''.join(current)) # 反转每个分支,然后反转分支顺序 reversed_branches = [reverse_regex_branch(branch) for branch in branches] reversed_branches.reverse() return '|'.join(reversed_branches) def text_to_regex(input_file, max_gap=100): if not os.path.exists(input_file): raise FileNotFoundError(f"Input '{input_file}' does not exist, check location.") output_file = os.path.join(os.path.dirname(input_file), 'regex.txt') output_reverse_file = os.path.join(os.path.dirname(input_file), 'regex_reverse.txt') with open(input_file, 'r') as f: lines = f.readlines() regex_parts = [] for line in lines: line = line.strip().lower() line = normalize_special_terms(line) terms = re.split(r'\s+(?:and|or)\s+', line) operators = re.findall(r'\s+(and|or)\s+', line) line_regex_parts = [terms[0]] for i in range(1, len(terms)): gap = f'.{{0,{max_gap}}}' if operators[i - 1] == 'and' else '|' line_regex_parts.append(gap + terms[i]) regex_parts.append(''.join(line_regex_parts)) reversed_regex_parts = [reverse_regex_order(regex) for regex in regex_parts] with open(output_file, 'w') as f: for regex in regex_parts: f.write(regex + '\n') with open(output_reverse_file, 'w') as f: for regex in reversed_regex_parts: f.write(regex + '\n') return regex_parts, reversed_regex_parts if __name__ == "__main__": input_file = '/input.txt' try: original_regex, reversed_regex = text_to_regex(input_file, max_gap=10) print("Regex Output:") print("\n".join(original_regex)) print("\nReversed Regex Output:") print("\n".join(reversed_regex)) except Exception as e: print(f"Error: {e}")
关键修复说明
- 顶级分支拆分:
reverse_regex_order函数用栈识别括号嵌套,确保只拆分顶级的|分隔分支,避免破坏括号内的子表达式结构。 - 分支内容反转:
reverse_regex_branch函数处理单个分支:- 用栈提取括号块和非括号块,对括号块递归反转内部内容,保留括号结构(如
(red|blue)反转为(blue|red))。 - 对非括号部分,按
.{0,N}间隔符拆分后反转顺序(如dogs.{0,10}cats反转为cats.{0,10}dogs)。
- 用栈提取括号块和非括号块,对括号块递归反转内部内容,保留括号结构(如
- 整体顺序反转:先反转每个分支的内容,再反转整个分支列表,确保顶级分支顺序与原正则相反。
测试结果
输入原正则dogs.{0,10}cats|(white|black)|(cat.{0,10}(red|blue)),修复后得到的反转结果与预期完全一致:(blue|red).{0,10}cat|(black|white)|cats.{0,10}dogs
内容的提问来源于stack exchange,提问作者LLP
相关产品推荐
相关产品推荐

