2015-08-18 2 views
1

Я пытаюсь написать сценарий в Python (2.7), который сэкономит мне некоторое время и преобразует Ascii в Dec и hex и наоборот, но при вводе специального символа (например: ') в качестве входных данных, кажется, что он не признает его буквой Ascii («isAscii» возвращает «False»). Я не мог найти правильное решение (я думал о регулярном выражении, но я не уверен), и мне было интересно, может ли кто-нибудь предложить мне какое-то направление?Устранение неполадок некоторых специальных символов из Ascii в Python

мой код:

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

_ «кажется, что оно не признает его как букву Асьи». Имеет смысл для меня. Апостроф - это не письмо. – Kevin

ответ

2

Я думаю, что это просто из-за того, что string.ascii_letters являются только буквы (а не все символы) .. Так что персонаж, как "не будет считаться действительным:

>>> import string 
>>> string.ascii_letters 
'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ' 

EDIT : Вот решение, найденное @Maayan, чтобы преодолеть эту проблему заключается в использовании:

def isAscii(s): 
    return all(ord(c) < 128 for c in s) 
+1

Спасибо @Challensois, я чувствую себя немного глупо, потому что не понял этого, но я думал, что ascii_letters включает все символы ascii. Во всяком случае, я использовал «вернуть все (ord (c) <128 для c in s»), и он работает ... – MSH

+0

Если вы удовлетворены предоставленным ответом, вы можете его принять. :) В любом случае, не волнуйтесь, мы все иногда совершаем такие ошибки;) – Challensois

+1

Я бы рекомендовал предложить решение в вашем ответе (если возможно), а не просто объяснить проблему OP. В этом случае было бы неплохо дать альтернативу «ord», чтобы ваш ответ содержал всю информацию, необходимую для этой проблемы. – SuperBiasedMan

2

решаемые его с помощью "return all(ord(c) < 128 for c in s)" для того, чтобы проверить, если вход ASCII вместо «Ascii.letters» (который, как вы указали для меня, не включает символы, которые не являются l Etters). Спасибо за помощь! :)

Смежные вопросы