【问题标题】:Python 2 string expression not recognised using Python 3使用 Python 3 无法识别 Python 2 字符串表达式
【发布时间】:2016-11-01 23:48:18
【问题描述】:

我有一个包含这个正则表达式的 python 脚本:

expression1 = ur'(.*?),\s(.*)\s(sold(?: post-exercise)?|bought|purchased|awarded|exercised|transferred in|transferred out|re-invested)\s*([\d,]*).*price of\s*(\d*.\d+?p)'

Python 解析器拒绝并抱怨其无效的语法。

为什么这种语法在 Python 3 中无效,但在 Python 2 中有效。 有没有办法可以编写它以同时使用这两个版本?

【问题讨论】:

    标签: python python-2.7 python-3.x


    【解决方案1】:

    Python 2 ur 字符串与 Python 3 有一个奇怪的不兼容,其中 \u\U 转义仍然会被处理而不是“原始”。当 u 前缀在 3.3 修订版中重新引入 Python 3 时,explicit decision 被用于排除 ur 组合,而不是具有不一致的行为。

    如果您想要一个在 Python 2 和 3 中都可以使用的原始 Unicode 字符串,则需要一种解决方法。可能性包括使用 br 原始字节串并使用适当的编解码器将其转换为 Unicode,或使用 from __future__ import unicode_literals 并使用普通的 r 前缀。小心\u\U 转义。

    【讨论】:

      【解决方案2】:

      Python 3 中的所有字符串都是 unicode,因此不需要前导 u。只需删除 u 即可使其与 Python 3 一起使用。

      【讨论】:

      • 不,字符串上的前导 u 在 Python 3 中非常好。
      • @user2357112 感谢您的提醒。
      【解决方案3】:

      我想说,拥有 Python 2/3 互操作性的最佳方法是使用:

      from __future__ import unicode_literals
      

      然后只需删除u。如果您明确需要字节,那么 b"these are byte-strings" 将适用于两个 2/3。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-12-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-06-13
        相关资源
        最近更新 更多