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
似乎中文文案排版指北里面有解决方案了,没细看过。
实际上中文和英文之间间隔的事情本应该交给排版软件来做,让写作者来手动处理并不是优雅的结果,而是一种无奈之举吧
是的
擦,强迫症福利啊。
纯文本的话也很无奈。
可以,怕是微软明天来合并了


