Unicode 对象可以将这些数字(阿拉伯文和波斯文)解释为实际数字 - 无需使用字符替换来翻译它们。
编辑 -
我想出了一种使用 Python2 正则表达式进行替换的方法:
# coding: utf-8
import re
# Attention: while the characters for the strings bellow are
# dislplayed indentically, inside they are represented
# by distinct unicode codepoints
persian_numbers = u'۱۲۳۴۵۶۷۸۹۰'
arabic_numbers = u'١٢٣٤٥٦٧٨٩٠'
english_numbers = u'1234567890'
persian_regexp = u"(%s)" % u"|".join(persian_numbers)
arabic_regexp = u"(%s)" % u"|".join(arabic_numbers)
def _sub(match_object, digits):
return english_numbers[digits.find(match_object.group(0))]
def _sub_arabic(match_object):
return _sub(match_object, arabic_numbers)
def _sub_persian(match_object):
return _sub(match_object, persian_numbers)
def replace_arabic(text):
return re.sub(arabic_regexp, _sub_arabic, text)
def replace_persian(text):
return re.sub(arabic_regexp, _sub_persian, text)
尝试“text”参数本身必须是 unicode。
(也可以通过使用 lambdas 并将一些表达式组合在一行中来缩短此代码,但这样做没有意义,但会失去可读性)
它应该对你有用,但请阅读我发布的原始答案
——原始答案
因此,如果您将变量实例化为 unicode(在引号字符前添加 u),则它们在 Python 中可以正确理解:
>>> persian_numbers = u'۱۲۳۴۵۶۷۸۹۰'
>>> english_numbers = u'1234567890'
>>> arabic_numbers = u'١٢٣٤٥٦٧٨٩٠'
>>>
>>> print int(persian_numbers)
1234567890
>>> print int(english_numbers)
1234567890
>>> print int(arabic_numbers)
1234567890
>>> persian_numbers.isdigit()
True
>>>
顺便说一句,unicode 对象不存在“maketrans”方法(在 Python2 中 - 请参阅注释)。
了解有关 unicode 的基础知识非常重要——对于每个人来说,即使是只编写英语程序的人,他们认为他们永远不会处理 26 个拉丁字母中的任何字符。在编写将处理不同字符的代码时,这一点至关重要 - 如果您不知道自己在做什么,除非偶然,否则该程序可能无法运行。
一篇非常好的文章是http://www.joelonsoftware.com/articles/Unicode.html - 请立即阅读。你可以记住,在阅读它时,Python 允许使用 unicode 对象的“encode”方法将 unicode 字符转换为任何“物理”编码的字符串。
>>> arabic_numbers = u'١٢٣٤٥٦٧٨٩٠'
>>> len(arabic_numbers)
10
>>> enc_arabic = arabic_numbers.encode("utf-8")
>>> print enc_arabic
١٢٣٤٥٦٧٨٩٠
>>> len(enc_arabic)
20
>>> int(enc_arabic)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: invalid literal for int() with base 10: '\xd9\xa1\xd9\xa2\xd9\xa3\xd9\xa4\xd9\xa5\xd9\xa6\xd9\xa7\xd9\xa8\xd9\xa9\xd9\xa0'
因此,字符在编码时失去了作为“单个实体”和数字的意义——编码对象(Python 2.x 中的 str 类型)只是一个字节串——但在将这些字符发送到程序的任何输出时仍然需要它- 无论是控制台、GUI 窗口、数据库、html 代码等...