在 Python 2 和 Python 3 中有效的原始 unicode 文字?

Posted

技术标签:

【中文标题】在 Python 2 和 Python 3 中有效的原始 unicode 文字?【英文标题】:Raw unicode literal that is valid in Python 2 and Python 3? 【发布时间】:2016-01-06 18:05:41 【问题描述】:

显然ur"" 语法在 Python 3 中已被禁用。但是,我需要它! “为什么?”,你可能会问。好吧,我需要 u 前缀,因为它是一个 unicode 字符串,我的代码需要在 Python 2 上运行。至于 r 前缀,也许它不是必需的,但我使用的标记格式需要很多反斜杠,这将有助于避免错误。

这是一个在 Python 2 中执行我想要但在 Python 3 中非法的示例:

tamil_letter_ma = u"\u0bae"
marked_text = ur"\a%s\bthe Tamil\cletter\dMa\e" % tamil_letter_ma

在遇到这个问题后,我找到http://bugs.python.org/issue15096 并注意到这句话:

克服限制很容易。

有人愿意提供一个想法吗?

相关:What exactly do "u" and "r" string flags do in Python, and what are raw string literals?

【问题讨论】:

【参考方案1】:

为什么不直接使用原始字符串文字 (r'....'),不需要指定 u,因为在 Python 3 中,字符串是 unicode 字符串。

>>> tamil_letter_ma = "\u0bae"
>>> marked_text = r"\a%s\bthe Tamil\cletter\dMa\e" % tamil_letter_ma
>>> marked_text
'\\aம\\bthe Tamil\\cletter\\dMa\\e'

要使其在 Python 2.x 中也能正常工作,请在源代码的最开头添加 the following Future import statement,以便源代码中的所有字符串文字都变为 unicode。

from __future__ import unicode_literals

【讨论】:

很有趣,但这会强制 all 字符串文字变成 unicode 字符串。这可能不切实际,并且恢复转义所有内容以便 Python 3 版本工作可能是最好的解决方案。 根据PEP 414,有一个关于Unicode转义的警告when using from __future__ import unicode_literals in Python 2, the nominally "raw" Unicode string literals will process \uXXXX and \UXXXXXXXX escape sequences, just like Python 2 strings explicitly marked with the "raw Unicode" prefix【参考方案2】:

首选方法是删除u'' 前缀并将from __future__ import unicode_literals 用作@falsetru suggested。但在您的具体情况下,您可能会滥用 "ascii-only string" % unicode 返回 Unicode 的事实:

>>> tamil_letter_ma = u"\u0bae"
>>> marked_text = r"\a%s\bthe Tamil\cletter\dMa\e" % tamil_letter_ma
>>> marked_text
u'\\a\u0bae\\bthe Tamil\\cletter\\dMa\\e'

【讨论】:

【参考方案3】:

Unicode 字符串是 Python 3.x 中的默认值,因此单独使用 r 将产生与 Python 2 中的 ur 相同的结果。

【讨论】:

-1;这忽略了问题的重点,即如何编写在 Python 2 和 Python 3 中同时有效的原始 unicode 文字。

以上是关于在 Python 2 和 Python 3 中有效的原始 unicode 文字?的主要内容,如果未能解决你的问题,请参考以下文章

在 Python 中读取最低有效位

在Python和MySQL中存储科学记数法的最有效方法

在 Python 3.6+ 中有效地按位置访问字典项

在 python/pandas 中有效地压缩多个列表

Python 3.9:使用标准库构造 DST 有效时间戳

Python - 寻找一种更有效的方法来重新编写字典中的键