2016-07-08 7 views
1

数字以外の文字列をすべて削除しようとしていますが、Why isn't isnumeric working?を読んだり、ユニコード文字列を持っている必要があります。Pythonアルファ数値は失敗しますが、アルファは機能します

>>> '㒃'.isalnum() 
True 
>>> '㒃'.isalpha() 
True 
>>> '㒃'.isnumeric() 
True 
>>> '㒃'.isalnum() and not '㒃'.isalpha() 
False 

:しかし、is.alnum()is.alpha()の両方のため、数字と英字の両方である文字があります

"".join([a for a in foo if a.isalnum() and not a.isalpha()]) 

"".join([a for a in foo if a.isnumeric()] 
+0

は、あなたが行ごとに異なる結果を与える文字列を持っていますか? – Alden

答えて

1

との差が、(もしあれば)何で、文字列にUnicodeと作業を必要としませんあなたがunicodedata.numericを使用して数値にそのシンボルに変換できることに注意してください:

>>> unicodedata.numeric('㒃') 
2.0 

およびisalphabytesクラスのメソッドでは、ASCII文字の結果が返されますが、その時点でbytesには、ユニコードのisnumericメソッドがありません。あなた自身を7ビットのASCIIに制限すると、isdigitisalnum() and not isalpha()に相当します。


簡単なforループを持つすべての違いを見つけることができます。

>>> for i in range(0x110000): 
...  c = chr(i) 
...  num1 = c.isnumeric() 
...  num2 = c.isalnum() and not c.isalpha() 
...  if num1^num2: 
...   print('Difference:', c, '(', i, ')', num1, num2) 
... 
Difference: 㐅 (13317) True False 
Difference: 㒃 (13443) True False 
Difference: 㠪 (14378) True False 
Difference: 㭍 (15181) True False 
Difference: 一 (19968) True False 
Difference: 七 (19971) True False 
Difference: 万 (19975) True False 
Difference: 三 (19977) True False 
Difference: 九 (20061) True False 
Difference: 二 (20108) True False 
# ... more ... 
+0

これは英語の場合、これが違うところにあるのか、それとももっと言語的なものなのでしょうか? – qwertylpc

+0

@qwertylpc ** isnumericのようなUnicodeとメソッドは、 *すべての*可能な言語?あなたが7bit ASCIIの外にあるものを気にしないならば、明らかに多くのことが役に立たなくなります。問題は、あなたが考えているコードを書くことができ、ユーザーがアプリケーションに何かを登録したり入力しようとすると、大部分の人があなたの前提を共有していないことを忘れてひどくクラッシュすることになります。 – Bakuriu

+0

はい、応答時にその姿勢が必要ない場合は、有効な質問をしました – qwertylpc

関連する問題