如何在控制台打印不含转义序列的ASCII字符列表?
筛选“友好”ASCII字符问题
需求
仅当ASCII字符ch的repr(ch)结果不以反斜杠开头时,才打印该字符,即输出所有这类“友好”的ASCII字符。
失败的实现代码
import re characters = [chr(num) for num in range(256)] # `characters` : 包含所有ASCII字符的列表 escaped_chars = [repr(ch)[1:-1] for ch in characters] # `escaped_chars`: 存储所有ASCII字符的转义形式 # 特殊字符会被转义,比如换行符存为"\n",回车符存为"\r" printables = "".join(filter(lambda s: s[0] != "\\", escaped_chars)) print("\n".join(re.findall('.{1,20}', "".join(printables))))
问题现象
运行上述代码后,输出中混入了ç、õ等非ASCII字符,完整输出如下:
!"#$%&'()*+,-./0123 456789:;<=>?@ABCDEFG HIJKLMNOPQRSTUVWXYZ[ ]^_`abcdefghijklmnop qrstuvwxyz{|}~¡¢£¤¥¦ §¨©ª«¬®¯°±²³´µ¶·¸¹º» ¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏ ÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâã äåæçèéêëìíîïðñòóôõö÷ øùúûüýþÿ
问题根源
- 范围错误:标准ASCII字符的取值范围是
0-127,但代码中用range(256)生成了0-255的字符,这包含了扩展ASCII(128-255)的字符。这些扩展字符不属于标准ASCII,且repr()不会对它们生成反斜杠开头的结果,因此被错误地纳入了输出。 - 转义处理冗余:
repr(ch)[1:-1]的操作虽然能提取转义后的内容,但没必要绕这一步,直接针对原始字符判断repr()的结果更直观,也能避免后续过滤时的潜在问题。
修正后的代码
方案一:缩小字符范围+直接判断
import re # 仅生成标准ASCII字符(0-127) characters = [chr(num) for num in range(128)] # 筛选repr结果不以反斜杠开头的字符 friendly_chars = [ch for ch in characters if not repr(ch).startswith('\\')] # 按每行20个字符格式化输出 print("\n".join(re.findall('.{1,20}', "".join(friendly_chars))))
方案二:更高效的遍历方式
import re friendly_chars = [] for num in range(128): ch = chr(num) if not repr(ch).startswith('\\'): friendly_chars.append(ch) print("\n".join(re.findall('.{1,20}', "".join(friendly_chars))))
正确输出结果
运行修正后的代码,输出仅包含标准ASCII中的友好字符:
!"#$%&'()*+,-./0123 456789:;<=>?@ABCDEFG HIJKLMNOPQRSTUVWXYZ[ ]^_`abcdefghijklmnop qrstuvwxyz{|}~
内容的提问来源于stack exchange,提问作者Toothpick Anemone
相关产品推荐
相关产品推荐

