首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Python 2和Python 3之间re模块的更改

Python 2和Python 3之间re模块的更改
EN

Stack Overflow用户
提问于 2014-01-17 05:18:58
回答 3查看 3.1K关注 0票数 1

我正在用Python3在Python 2下开发的代码上运行我的单元测试套装。所有的单元测试都是在Python2下通过的,但对于Python3却没有。re的实现似乎有了一些变化,这对我来说真是太麻烦了。下面是一个复制我的问题的最小的工作示例:

代码语言:javascript
运行
复制
Python 2.7.6 (default, Dec 10 2013, 20:01:46) 
>>> import re
>>> a = re.compile('test', re.IGNORECASE)
>>> assert a.flags == re.IGNORECASE
>>> # No output,  i.e. assertion passed
>>> a.flags
2
>>> re.IGNORECASE
2

代码语言:javascript
运行
复制
Python 3.3.3 (default, Dec 10 2013, 20:13:18)
>>> import re
>>> a = re.compile('test', re.IGNORECASE)
>>> assert a.flags == re.IGNORECASE
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AssertionError
>>> a.flags
34
>>> re.IGNORECASE
2

显然发生了一些我不希望发生的事情!我假设有一组默认标志可以使flags在python3中为34。我想知道的是这些是什么,这样我就可以通过与适当的标志进行比较来传递我的断言。作为奖励,这样做的目的是什么?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-01-17 05:32:50

下面是Python3.x中的RegEx标志。

代码语言:javascript
运行
复制
import re
print (re.IGNORECASE)
print (re.LOCALE)
print (re.MULTILINE)
print (re.DOTALL)
print (re.UNICODE)
print (re.VERBOSE)
print (re.DEBUG)
print (re.A)

输出

代码语言:javascript
运行
复制
2
4
8
16
32
64
128
256

docs

字符串是Unicode代码点的不可变序列。

因此,默认情况下启用了re.UNICODE标志。既然您已经启用了re.IGNORECASE,那就是带有re.UNICODE的ORed,这就给了您34

票数 5
EN

Stack Overflow用户

发布于 2014-01-17 05:28:47

这是因为在Python3中,字符串是unicode,因此默认情况下UNICODE标志是有意义的。

Python 3:

代码语言:javascript
运行
复制
>>> a = re.compile("a")
>>> a.flags
32
>>> [k for k in dir(re) if getattr(re, k) == 32]
['U', 'UNICODE']
票数 3
EN

Stack Overflow用户

发布于 2014-01-17 05:30:49

在深入研究了re源代码之后,我在“sre_parse.py”中找到了以下内容:

代码语言:javascript
运行
复制
def fix_flags(src, flags):
    # Check and fix flags according to the type of pattern (str or bytes)
    if isinstance(src, str):
        if not flags & SRE_FLAG_ASCII:
            flags |= SRE_FLAG_UNICODE # <===== LOOK AT THIS LINE!!!!!
        elif flags & SRE_FLAG_UNICODE:
            raise ValueError("ASCII and UNICODE flags are incompatible")
    else:
        if flags & SRE_FLAG_UNICODE:
            raise ValueError("can't use UNICODE flag with a bytes pattern")
    return flags

如果未添加"UNICODE“标志,则为您添加。它的值是SRE_FLAG_UNICODE == 32,所以是2 | 32 == re.IGNORECASE | re.UNICODE == 34

这个函数在python2.x的实现中不存在。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21178424

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档