2017-03-27 17 views
1

次のコードでは、UnicodeEncodeError: 'ascii'コーデックは位置7の文字 'u2013'をエンコードできません。

phonenumbers = ['(209) 525-2987', '509-477-4598', None, '229-259–1234'] 
phoneCheck = re.compile('^[1-9]\d{2}-\d{3}-\d{4}$') 

for pn in phonenumbers: 
    print pn 
    if phoneCheck.match(str(pn)): 
     print 'Matched!' 
    else: 
     print 'Not Matched!' 

それが一致しないとマークされたように、私はこれを修正する方法を、私は結果にこのエラーを受け取ったと私はそれは、電話番号で使用されているダッシュの間違った種類に関係していると考えていますか?

(209) 576-6546 
Not Matched! 
509-477-6726 
Not Matched! 
None 
Not Matched! 
229-259–9756 
Runtime error 
Traceback (most recent call last): 
    File "<string>", line 6, in <module> 
UnicodeEncodeError: 'ascii' codec can't encode character u'\u2013' in position 7: ordinal not in range(128) 
+0

これはユニコードではよくある問題ですが、今まで何を試しましたか? http://stackoverflow.com/search?q=UnicodeEncodeError%3A+%27ascii%27+codec+can%27t+encode+character+u%27%5Cu2013%27+in+ –

+0

'u '\ u2013''はユニコードのキャラクタではなくアスキーコード – Dadep

+0

私は何も試していませんが、これはコードで手に入れた最初のUnicodeEncodeErrorです@DavidZemens上記のコードで何をすればいいですか? – Purplepeopleeater

答えて

1

あなたの診断は正しいです。 (最後の電話番号の2番目のダッシュはなんらかの形のダッシュです。ワードプロセッサやスプレッドシートから電話番号をコピーアンドペーストしてもらえます)。

ここでは、簡単な方法:ユニコードコードをインストールしてください:

import re 
import warnings 

import unidecode 

dash = u'\u2013' 
phonenumbers = ['(209) 525-2987', '509-477-4598', None, '229-259' + dash + '1234'] 
phoneCheck = re.compile('^[1-9]\d{2}-\d{3}-\d{4}$') 

# if you pass an ascii string into unidecode, it will complain, but still work. 
# Just catch the warnings. 
with warnings.catch_warnings(): 
    warnings.simplefilter("ignore") 

    for pn in phonenumbers: 
     print pn 

     # if pn is None, it's not a phone number (and None will cause unidecode 
     # to throw an error) 
     if pn and phoneCheck.match(unidecode.unidecode(pn)): 
      print 'Matched!' 
     else: 
      print 'Not Matched!' 
関連する問題