当我们想要组合 re.IGNORECASE 和 re.DOTALL 时,为什么要使用按位或运算符?

问题描述

来自我的教科书(自动化无聊的东西,Al Sweigart): “如果您想要一个不区分大小写的正则表达式并且包含换行符以匹配点字符,您可以像这样形成 re.compile() 调用

someRegexValue = re.compile('foo',re.IGnorECASE | re.DOTALL)

不幸的是,re.compile() 函数仅将一个值作为其第二个参数。您可以通过使用管道字符 (re.IGnorECASE) 组合 re.DOTALL| 变量来绕过此限制,在此上下文中称为 按位或操作员。

页面作为附加资源提供:https://wiki.python.org/moin/BitwiseOperators/

我不明白为什么我们不使用 按位和 运算符。参考那个页面,如果我们将 x 和 y 视为一些匹配条件,并且两者必须同时应用,我会直观地使用 and 运算符...

我们不能这样做有什么原因吗?

解决方法

各种 re.FLAGS 是位掩码的一部分,每个标志都是 2 的某个值以占据某个位位置。例如:

re.IGNORECASE =  2 = 00010
re.DOTALL     = 16 = 10000

因此,表达式 re.IGNORECASE | re.DOTALL 将生成以下位掩码:

10010

许多 re 库函数的 flags 参数需要这样的位掩码来决定应用哪些标志。如果我们按位 & 上述两个运算符,我们只会得到零。事实上,对于两个不同标志之间的 any 按位 &,我们会得到零,因为没有位会重叠。