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

