使用Python 3无法识别Python 2字符串表达式

时间:2016-11-01 23:48:19

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

我有一个包含这个正则表达式的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解析器barfs并且抱怨它的语法无效。

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

3 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:2)

Python 3中的所有字符串都是 unicode ,因此不需要前导u。只需删除MERGE (a {id:'a'}) ON MATCH SET a.value = a.value+2; 即可使其与Python 3一起使用。

答案 2 :(得分:1)

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

from __future__ import unicode_literals

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