5

形式で電話番号を受け入れ、XXX-XXX-XXXXエントリ内の文字を対応する番号に変換するプログラムを作成しようとしています。

これで、開始が正しくない場合は正しい番号を再入力できますが、入力された元の番号が変換されます。どうすればこれを修正できますか?

def main():
    phone_number= input('Please enter a phone number in the format XXX-XXX-XXXX: ')
    validNumber(phone_number)
    translateNumber(phone_number)

def validNumber(phone_number):
for i,c in enumerate(phone_number):
    if i in [3,7]:
        if c != '-':
            phone_number=input('Please enter a valid phone number: ')
        return phone_number
    elif not c.isalnum():
        phone_number=input('Please enter a valid phone number: ')
        return phone_number
return phone_number


def translateNumber(phone_number):
    s=""
    for char in phone_number:
        if char is '1':
            x1='1'
            s= s + x1
        elif char is '-':
            x2='-'
            s= s + x2
        elif char in 'ABCabc':
            x3='2'
            s= s + x3
        elif char in 'DEFdef':
            x4='3'
            s= s + x4
        elif char in 'GHIghi':
            x5='4'
            s= s + x5
        elif char in 'JKLjkl':
            x6='5'
            s= s + x6
        elif char in 'MNOmno':
            x7='6'
            s= s + x7
        elif char in 'PQRSpqrs':
            x8='7'
            s= s + x8
        elif char in 'TUVtuv':
            x9='8'
            s= s + x9
        elif char in 'WXYZwxyz':
            x10='9'
            s= s + x10
    print(s)
4

6 に答える 6

12
import re

def validNumber(phone_nuber):
    pattern = re.compile("^[\dA-Z]{3}-[\dA-Z]{3}-[\dA-Z]{4}$", re.IGNORECASE)
    return pattern.match(phone_nuber) is not None
于 2013-03-06T21:51:18.330 に答える
4

正規表現を使用したくない場合: を使用isalnumして、何かが数字か文字かを確認できます。sonを使用して文字列内の th 文字にアクセスできます。次を試してください。mystr[n]

def validNumber(phone_number):
    if len(phone_number) != 12:
        return False
    for i in range(12):
        if i in [3,7]:
            if phone_number[i] != '-':
                return False
        elif not phone_number[i].isalnum():
            return False
    return True

phone_number[i]が行われているかを確認するには、次を試してください。

for i in range(len(phone_number)):
    print i, phone_number[i]

使用enumerate:

def validNumber(phone_number):
    for i,c in enumerate(phone_number):
        if i in [3,7]:
            if c != '-':
                return False
        elif not c.isalnum():
            return False
    return True

機能したら、後で ( の中でmain) 次のように使用する必要があります。

def main():
    phone_number = '' # an invalid number to initiate while loop
    while not validNumber(phone_number):
        phone_number = input('Please enter a phone number in the format XXX-XXX-XXXX: ')
    translated_number = translateNumber(phone_number)
于 2013-03-06T21:55:28.570 に答える
3
  1. テキストを照合するには、正規表現を使用する必要があります。
  2. string モジュールには、translateほとんどのロジックを置き換える関数があります

以下のコード例。正規表現と翻訳を簡素化するために、すべてを小文字にキャストする方法に注意してください。

import string
import re

RE_phone = re.compile("^[a-z0-9]{3}-[a-z0-9]{3}-[a-z0-9]{4}$")

map_in  = 'abcdefghijklmnprstuvwxyz'
map_out = '222333444555667778889999'
mapped = string.maketrans( map_in , map_out )


def main():
    while True:
        phone_number= raw_input('Please enter a phone number in the format XXX-XXX-XXXX: ')
        phone_number = phone_number.lower()
        if RE_phone.match(phone_number):
            break
        print "Error. Please try again"
    print translateNumber(phone_number)

def translateNumber(phone_number):
    return phone_number.translate( mapped )

main()
于 2013-03-06T22:04:19.383 に答える
-1

これは私の意見ではかなりパイソン的な方法です

def validNumber(phone_number):
    return all([x.isdigit() for x in phone_number.split("-")])

入力を「-」で分割し、残りの各項目が数値であることを確認して、単一のTrueまたはFalse値を返します。

all() - returns True if bool(x) is True for all x in iterable

于 2013-03-06T22:37:38.970 に答える