Python打印ASCII字符含中文时保持对齐

需求

我们打印Python字符串的时候,会在单词间增加空格和制表符,让输出的列表或ASCII表格对齐。

比如下面这个ASCII表格

# ╔════╦════════╦═════════╦═══════╗
# ║ id ║  name  ║ course  ║ score ║
# ╠════╬════════╬═════════╬═══════╣
# ║  1 ║ Alex   ║ English ║    90 ║
# ║  2 ║ Elaine ║ Math    ║    92 ║
# ║  3 ║ Tom    ║ Science ║    88 ║
# ║  4 ║ Sophia ║ History ║    94 ║
# ╚════╩════════╩═════════╩═══════╝

字符串都是英文的时候没有问题,但是一旦字符串包含中文或者其它非 ASCII 字符,就会出现很难对齐的情况。

World!!# 7个普通空格
Hello你好     ║ # 5个普通空格
Hello你好      ║ # 6个普通空格

原因在于中文这类非ASCII字符的宽度比英文字母的宽度大,这就要对中文进行特殊处理。

方案

为了让ASCII字符能够对齐,通常会在字符间隙增加足够的空格,普通的空格" "属于ASCII字符,Unicode编码 U+0020,而如果有中文或者中文标点符号的话,就需要使用中文全角空格来补齐空白,Unicode编码 U+3000

这里我们简单做一个演示,当我们识别字符的时候,统计中文字符的长度后,使用同等长度的普通空格和剩余长度的全角空格补齐。相当于每一个ASCII字符都有一个非ASCII字符配对,长度肯定相同。

可以得到以下输出

Hello你好       ║ # 2个普通空格+5个全角空格
World!!       ║ # 7个全角空格

代码

import re

re_chinese = re.compile(r"[\u4e00-\u9fa5\!\?\。\"\'\(\)\*\+\,\-\/\:\;\<\=\>\@\[\\\]\^\_\`\{\|\}\~\⦅\⦆\、\〃\《\》\「\」\『\』\【\】\〔\〕\〖\〗\〘\〙\〚\〛\〜\〝\〞\〟\〰\〾\〿\–\—\‘\’\‛\“\”\„\‟\…\‧\﹏\.]", re.S)

def format_ascii(text) :
    t= re.findall(re_chinese,text)
    count = len(t)
    return text  + " " * count + u"\u3000" * (len(text) - count)


print(format_ascii("Hello你好") + "║")
print(format_ascii("World!!") + "║")

在线演示 Python 在线编辑器

总结

以上就是关于Python开发中遇到的中文字符串对齐问题,基本上满足了我们的开发需求,可能还有些细节没有注意到,欢迎大家提出更好的想法。

参考

评论