在 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 文字?的主要内容,如果未能解决你的问题,请参考以下文章