我正在尝试用Python编写一个脚本(2.7),它可以节省一些时间并将Ascii转换为Dec和hex,反之亦然,但是当输入一个特殊的char(例如:')作为输入时,它似乎不承认它为Ascii字母(“isAscii”返回“False”)。 我找不到合适的解决方案(我考虑过正则表达式,但我不确定),并且想知道是否有人可以给我一些方向?
我的代码:
import struct
import string
import re
def isAscii(s):
for c in s:
if c not in string.ascii_letters:
return False
return True
is_hex = re.compile(
r'^[+\-]?'
'0'
'[xX]'
'(0|'
'([1-9A-Fa-f][0-9A-Fa-f]*))$'
).match
End='0'
while (End!='1'):
print("Please enter your input:")
num = raw_input()
num = num.split(',')
for i in range (0,len(num)):
if isAscii(num[i]):
print("Decimal: %d, Hex: %s") %(ord(str(num[i])) ,hex(ord(str(num[i]))))
elif is_hex(num[i]):
print("Decimal: %d, Chr: %s") %(ord((chr(int(num[i], 16)))) ,(chr(int(num[i], 16))))
else:
print("Hex: %s, Chr: %s") % (hex(int(num[i])) ,(chr(int(num[i]))))
print("Press any key to continue OR Press 1 to exit")
End = raw_input()
非常感谢!
答案 0 :(得分:2)
我认为这只是因为string.ascii_letters只是字母(而不是所有字符)。所以像''不会被视为有效:
>>> import string
>>> string.ascii_letters
'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
编辑: 以下是@Maayan为解决这个问题而找到的解决方案是使用:
def isAscii(s):
return all(ord(c) < 128 for c in s)
答案 1 :(得分:2)
使用"return all(ord(c) < 128 for c in s)"
解决它以检查输入是否为ascii而不是“Ascii.letters”(正如您指出的那样,不包括不是字母的字符)。
谢谢你的帮助! :)