Python中如何编写脚本自动修正中文英文混合排版中的全半角与空格问题

https://github.com/martinwu42/typeset

欢迎围观 / 星星 / 吐槽~


Python中如何编写脚本自动修正中文英文混合排版中的全半角与空格问题
11 回复

不错,正需要


#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
中文英文混合排版自动修正脚本
功能:全半角转换、中英文空格规范化
"""

import re

def normalize_text(text):
    """
    主处理函数:执行全半角转换和空格规范化
    
    处理规则:
    1. 全角字母数字 -> 半角
    2. 半角标点 -> 全角(中文语境常用标点)
    3. 中英文间添加空格
    4. 清理多余空格
    """
    
    # 全角字符转半角(字母、数字)
    def full_to_half(char):
        code = ord(char)
        if 0xFF01 <= code <= 0xFF5E:  # 全角字符范围
            return chr(code - 0xFEE0)
        elif code == 0x3000:  # 全角空格
            return ' '
        return char
    
    # 半角标点转全角(常见中文标点)
    def half_to_full_punct(char):
        punct_map = {
            ',': ',',
            '.': '。',
            ':': ':',
            ';': ';',
            '!': '!',
            '?': '?',
            '(': '(',
            ')': ')',
            '[': '【',
            ']': '】',
            '<': '《',
            '>': '》'
        }
        return punct_map.get(char, char)
    
    # 第一步:全角字母数字转半角
    text = ''.join(full_to_half(c) for c in text)
    
    # 第二步:中文标点半角转全角
    text = ''.join(half_to_full_punct(c) for c in text)
    
    # 第三步:中英文间添加空格
    # 中文后接英文(排除已存在的空格)
    text = re.sub(r'([\u4e00-\u9fff])([a-zA-Z])', r'\1 \2', text)
    # 英文后接中文(排除已存在的空格)
    text = re.sub(r'([a-zA-Z])([\u4e00-\u9fff])', r'\1 \2', text)
    
    # 第四步:清理多余空格(保留中英文间的单个空格)
    # 合并连续空格
    text = re.sub(r'[ \t]+', ' ', text)
    # 移除中文间的空格(中文字符间的空格)
    text = re.sub(r'([\u4e00-\u9fff])[ ]+([\u4e00-\u9fff])', r'\1\2', text)
    # 移除全角标点前的空格
    text = re.sub(r'[ ]+([,。:;!?)】》])', r'\1', text)
    # 移除全角标点后的空格
    text = re.sub(r'([(【《])[ ]+', r'\1', text)
    
    return text.strip()

def process_file(input_file, output_file=None):
    """处理文件"""
    with open(input_file, 'r', encoding='utf-8') as f:
        content = f.read()
    
    result = normalize_text(content)
    
    if output_file:
        with open(output_file, 'w', encoding='utf-8') as f:
            f.write(result)
        print(f"处理完成,结果已保存到: {output_file}")
    else:
        print("处理结果:")
        print("-" * 40)
        print(result)
        print("-" * 40)

# 使用示例
if __name__ == "__main__":
    # 示例文本
    test_text = """
    这是一段测试文本,包含全半角混合问题。
    Hello World!这是全角英文。
    半角数字:123,全角数字:123。
    中英文混合:Python很棒!
    多余空格问题:这  是   测试。
    """
    
    print("原始文本:")
    print(test_text)
    print("\n处理后文本:")
    print(normalize_text(test_text))
    
    # 处理文件示例(取消注释使用)
    # process_file("input.txt", "output.txt")

这个脚本的核心逻辑分四步:先把全角字母数字转成半角,再把中文标点转成全角,然后在中英文之间加上合适的空格,最后清理多余的空格。正则表达式处理中英文边界,标点映射表处理全半角转换。

用的时候直接调normalize_text()函数就行,传进去要处理的字符串,返回修正后的结果。文件处理可以用process_file()函数。

简单说就是四步转换:全角转半角、标点规范化、加空格、清空格。

「有研究显示,打字的时候不喜欢在中文和英文之间加空格的人,感情路都走得很辛苦,有七成的比例会在 34 岁的时候跟自己不爱的人结婚,而其余三成的人最后只能把遗产留给自己的猫。毕竟爱情跟书写都需要适时地留白。与大家共勉之。」赞一个!

https://github.com/sparanoid/chinese-copywriting-guidelines
似乎中文文案排版指北里面有解决方案了,没细看过。

实际上中文和英文之间间隔的事情本应该交给排版软件来做,让写作者来手动处理并不是优雅的结果,而是一种无奈之举吧

我也觉得,所以脚本里可以设置 minor_space

擦,强迫症福利啊。

纯文本的话也很无奈。

可以,怕是微软明天来合并了

回到顶部