【问题标题】:python version 3.4 does not support a 'ur' prefixpython 3.4版不支持'ur'前缀
【发布时间】:2014-09-26 16:13:39
【问题描述】:

我有一些用旧版本的 python(2.x) 编写的 python 代码,我很难让它工作。我正在使用 python 3.4

_eng_word = ur"[a-zA-Z][a-zA-Z0-9'.]*"

(它是分词器的一部分)

【问题讨论】:

  • 你想让这个工作在Python 2 和 Python 3 上工作吗?还是仅在 Python 3 上?
  • 感谢您的快速回复!我只需要它在 python 3 上工作。

标签: python python-3.x


【解决方案1】:

http://bugs.python.org/issue15096

标题:放弃对“ur”字符串前缀的支持
当 PEP 414 在 Python 3 中恢复对显式 Unicode 文字的支持时,“ur”字符串前缀被认为是“r”前缀的同义词。

所以,用'r'代替'ur'

【讨论】:

  • 然而,它在 Python 2.7 中不是同义词。
  • 这与 OP 无关,他们正试图使其在 3.4 中工作。我的阅读是,如果他们想要 3.4 和 2.7,他们会这么说。
  • 它已被删除,因为 Python 2 ur'...' 原始字符串文字的行为无法重现。
  • 当然,是隐含的假设让我们大吃一惊。 :-P
  • PY2 和 PY3 对源文件中包含某些字节/字符/字形的含义有着根本不同的解释的另一个地方。 PY3 更加规范,不那么模棱两可,但并不总是有简洁、简洁的方法来让源文件在两者中运行相同。 6 之类的兼容性库似乎无法解决这种情况。
【解决方案2】:

确实,Python 3.4 仅支持 u'...'(以支持需要在 Python 2 和 3 上运行的代码)和 r'....',但不能同时支持两者。这是因为 ur'..' 在 Python 2 中的工作方式与 ur'..' 在 Python 3 中的工作方式不同(在 Python 2 中,\uhhhh\Uhhhhhhhh 转义仍在处理中,在 Python 3 中为“r”。 ..' 字符串不会)。

请注意,在这种特殊情况中,原始字符串文字和常规字符串之间没有区别!您可以使用:

_eng_word = u"[a-zA-Z][a-zA-Z0-9'.]*"

它适用于 Python 2 和 3。

对于原始字符串文字确实很重要的情况,您可以解码 Python 2 上raw_unicode_escape 的原始字符串,在Python 3 上捕获AttributeError

_eng_word = r"[a-zA-Z][a-zA-Z0-9'.]*"
try:
    # Python 2
    _eng_word = _eng_word.decode('raw_unicode_escape')
except AttributeError:
    # Python 3
    pass

如果您正在编写 Python 3 代码(因此它不必再在 Python 2 上运行),只需完全删除 u

_eng_word = r"[a-zA-Z][a-zA-Z0-9'.]*"

【讨论】:

  • 我赞成你的 raw_unicode_string 编码理念,但是你的代码会在 Python 2 和 Python 3 之间产生不同的结果。
  • @itsadok:对于这些目的来说已经足够接近了。您也可以使用常规字符串、双转义反斜杠然后解码为unicode_escape_eng_word = '[a-zA-Z][a-zA-Z0-9'.]*'; _eng_word.replace(r'\\', r'\\\\').decode('unicode_escape'),这是six 使用的方法。
  • @itsadok: 并考虑到\uhhhh 模式在re 中也有意义。因此,即使在 Python 3 中,您最终得到 \\uhhhh(转义)Unicode 序列,它们在正则表达式中的含义仍然与您传入文字 Unicode 代码点的含义相同。
【解决方案3】:

此表比较了 Python 2(.7) 和 3(.4+) 中(部分)不同的字符串文字前缀:

如您所见,在 Python 3 中,没有办法让文字不处理转义,但处理 unicode 文字。要获得在 Python 2 和 3 中都可以使用的代码的此类字符串,请使用:

br"[a-zA-Z][a-zA-Z0-9'.]*".decode('raw_unicode_escape')

实际上,您的示例不是很好,因为它没有任何 unicode 文字或转义序列。一个更好的例子是:

br"[\u03b1-\u03c9\u0391-\u03a9][\t'.]*".decode('raw_unicode_escape')

在 python 2 中:

>>> br"[\u03b1-\u03c9\u0391-\u03a9][\t'.]*".decode('raw_unicode_escape')
u"[\u03b1-\u03c9\u0391-\u03a9][\\t'.]*"

在 Python 3 中:

>>> br"[\u03b1-\u03c9\u0391-\u03a9][\t'.]*".decode('raw_unicode_escape')
"[α-ωΑ-Ω][\\t'.]*"

其实是一回事。

【讨论】:

    猜你喜欢
    • 2017-08-17
    • 1970-01-01
    • 1970-01-01
    • 2013-11-25
    • 2015-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-22
    相关资源
    最近更新 更多