如何让Python将输入的 解析为制表符而非字面量?
解决input()输入转义字符无法被解析的问题
我写了个字符替换程序,目标是把语句里的“is a”替换成两个制表符。但用input()输入制表符相关内容时,输出的是字面量而非实际制表符;直接给new赋值成两个实际制表符时,print()能正常替换。怎么改代码才能让输入的字符被解析成实际的制表符?
原代码:
line = "Microsoft Word is a word processor" remove = "is a" new = input("new characters: ") # 输入两个制表符或者\t\t # 直接赋值new = ' '(两个实际制表符)能正常工作 line = line.replace(remove, new) print(line)
测试情况:
- 输入
\t\t(或直接按两次tab)时,输出显示Microsoft Word word processor(字面量的\t\t) - 直接赋值
new=' '时,输出显示Microsoft Word word processor(正确的制表符空格)
两种解决办法
1. 用unicode_escape解码转义序列
input()拿到的是原始字符串,比如你输入\t\t,实际得到的是'\\t\\t'(两个转义后的反斜杠加t)。通过先编码再用unicode_escape解码,可以把这些转义序列转换成实际的控制字符:
line = "Microsoft Word is a word processor" remove = "is a" # 解析输入的转义序列 new = input("new characters: ").encode().decode("unicode_escape") line = line.replace(remove, new) print(line)
现在你输入\t\t,程序就会把它转换成两个实际的制表符,输出就能正常显示空格了。
2. 用ast.literal_eval解析字面量
如果你想让输入更贴近Python字符串的写法,可以用ast模块的literal_eval,它能安全地把输入字符串转换成对应的Python字面量:
import ast line = "Microsoft Word is a word processor" remove = "is a" try: # 把输入包裹成双引号,让literal_eval识别为字符串 new = ast.literal_eval(f'"{input("new characters: ")}"') except (SyntaxError, ValueError): # 输入格式不对时, fallback到原始输入 new = input("new characters: ") line = line.replace(remove, new) print(line)
这种方法需要你输入符合字符串格式的内容,比如输入\t\t就会被解析成制表符;如果直接按tab键输入,有些终端可能会把tab当成缩进,所以更推荐输入\t\t这种转义序列。
问题根源
input()会原封不动地读取你输入的所有内容,不会自动解析任何转义序列。而直接写new=' '时,Python在编译代码的时候就已经把字符串里的制表符转换成了实际的控制字符,所以print()能正常输出空格。
内容的提问来源于stack exchange,提问作者Patrick T. Stingley
相关产品推荐
相关产品推荐

