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

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

原代码问题点

  1. 正则拆分逻辑错误:拆分正则时未区分顶级分支与括号内的子表达式,导致括号被拆分为独立元素,破坏结构完整性。
  2. 括号内反转逻辑混乱:reverse_inside_parentheses函数的栈处理逻辑错误,颠倒了括号的位置((和)顺序反转),且未正确处理嵌套括号的内容反转。
  3. 整体反转顺序错误:直接反转拆分后的所有元素列表,导致正则结构彻底混乱。

修复后的代码

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}")

关键修复说明

  1. 顶级分支拆分:reverse_regex_order函数用栈识别括号嵌套,确保只拆分顶级的|分隔分支,避免破坏括号内的子表达式结构。
  2. 分支内容反转:reverse_regex_branch函数处理单个分支:
    • 用栈提取括号块和非括号块,对括号块递归反转内部内容,保留括号结构(如(red|blue)反转为(blue|red))。
    • 对非括号部分,按.{0,N}间隔符拆分后反转顺序(如dogs.{0,10}cats反转为cats.{0,10}dogs)。
  3. 整体顺序反转:先反转每个分支的内容,再反转整个分支列表,确保顶级分支顺序与原正则相反。

测试结果

输入原正则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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 11:20:59