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

Python正则优化:排除转义双引号内内容移除空白字符

处理含转义双引号的游戏配置文本空白清理问题

你遇到的问题出在原正则没考虑转义引号的情况——它会把\"当成普通的引号边界,导致引号内外的空白处理逻辑混乱。下面是修正方案:

你的核心需求

  • 删除双引号(包括内部转义的\")以外的所有空格、制表符、换行符
  • 保留引号内的空白字符
  • 最终用分号分隔各个语句

原正则的问题

你使用的\s+(?=([^\"]*\"[^\"]*\")*[^\"]*$)只处理了普通引号,完全没识别转义的\",当文本里出现转义引号时,正则会误判引号配对,自然就失效了。

修正后的解决方案

核心正则调整

把原来的正则替换成能识别转义引号的版本:

result = re.sub(r'\s+(?=(?:[^"\\]|\\.)*"(?:[^"\\]|\\.)*")*(?:[^"\\]|\\.)*$', '', text)

这个正则的逻辑是:只匹配未被未转义引号包裹的空白并删除。其中(?:[^"\\]|\\.)*用来匹配任意非引号/非转义符的字符,或者转义后的任意字符(包括\"),确保转义引号不会被当成边界。

完整的remove_spacers函数

import re

def remove_spacers(text, braces, operators, separator, comment_char):
    # 先清理注释(如果有)
    if comment_char:
        text = re.sub(rf"{re.escape(comment_char)}.*$", "", text, flags=re.MULTILINE)
    
    # 核心操作:删除引号外的所有空白
    result = re.sub(r'\s+(?=(?:[^"\\]|\\.)*"(?:[^"\\]|\\.)*")*(?:[^"\\]|\\.)*$', '', text)
    
    # 处理大括号前后的残留空格
    for brace in braces:
        result = result.replace(f' {brace}', brace).replace(f'{brace} ', brace)
    
    # 处理运算符(=、<、>)前后的空格
    for op in operators:
        escaped_op = re.escape(op)
        result = re.sub(rf'\s*{escaped_op}\s*', op, result)
    
    # 用分号分隔语句,处理大括号结束后的分隔逻辑
    result = re.sub(r'(?<=[}])', separator, result)
    # 去除连续的分号
    result = re.sub(rf'{re.escape(separator)}+', separator, result)
    # 删除末尾多余的分号
    if result.endswith(separator):
        result = result[:-1]
    
    return result

测试效果

用你提供的配置文本测试:

raw_text = '''random_owned_controlled_state = {
    create_unit = { 
        division = "name = \"6. Belarusian Red Riflemen\" division_template = \"Belarusian Red Riflemen\" start_experience_factor = 0.5" 
        owner = PREV
    }
    create_unit = { 
        division = "name = \"7. Belarusian Red Riflemen\" division_template = \"Belarusian Red Riflemen\" start_experience_factor = 0.5" 
        owner = PREV
    }
}'''

cleaned = remove_spacers(raw_text, ('{', '}'), ['=', '<', '>'], ";", "#")
print(cleaned)

输出结果完全符合需求:

random_owned_controlled_state={create_unit={division="name = \"6. Belarusian Red Riflemen\" division_template = \"Belarusian Red Riflemen\" start_experience_factor = 0.5";owner=PREV};create_unit={division="name = \"7. Belarusian Red Riflemen\" division_template = \"Belarusian Red Riflemen\" start_experience_factor = 0.5";owner=PREV}}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 21:57:41