了解正则表达式标志和按位运算符

Understanding regex flags and Bitwise operators

我正在尝试了解所有正则表达式标志和按位是如何联系在一起的。我唯一能真正找到与此相关的是在 documentation 中,它说你可以使用 Bitwise 或 '|'操作员。我过去在使用标志时一直使用该运算符,但我想知道它是如何工作的以及使用其他运算符(&、^、~、>>、<<)[=14= 的优势是什么? ]

根据我的理解,每个标志代表一个值?

print('{:>15} = {}'.format('re.ASCII',      int(re.ASCII)))
print('{:>15} = {}'.format('re.DEBUG',      int(re.DEBUG)))
print('{:>15} = {}'.format('re.IGNORECASE', int(re.IGNORECASE)))
print('{:>15} = {}'.format('re.LOCALE',     int(re.LOCALE)))
print('{:>15} = {}'.format('re.MULTILINE',  int(re.MULTILINE)))
print('{:>15} = {}'.format('re.DOTALL',     int(re.DOTALL)))
print('{:>15} = {}'.format('re.VERBOSE',    int(re.VERBOSE)))

>       re.ASCII = 256
>       re.DEBUG = 128
>  re.IGNORECASE = 2
>      re.LOCALE = 4
>   re.MULTILINE = 8
>      re.DOTALL = 16
>     re.VERBOSE = 64

这些例子有什么不同:

re.compile('[\w]+', flags=(re.IGNORECASE | re.MULTILINE)
re.compile('[\w]+', flags=(re.IGNORECASE & re.MULTILINE)
re.compile('[\w]+', flags=(re.IGNORECASE ^ re.MULTILINE)
or
re.compile('[\w]+', flags=(re.DOTALL | re.MULTILINE)
re.compile('[\w]+', flags=(re.DOTALL & re.MULTILINE)
re.compile('[\w]+', flags=(re.DOTALL ^ re.MULTILINE)

按位table供参考:

Operator Example Meaning
& a & b Bitwise AND
| a | b Bitwise OR
^ a ^ b Bitwise XOR (exclusive OR)
~ ~a Bitwise NOT
<< a << n Bitwise left shift
>> a >> n Bitwise right shift

使用标志只是常见的做法。 在 python、C++ 程序中,也许还有其他程序,标志通常以这种风格使用。我举个例子。

re.compile('[\w]+', flags=(re.IGNORECASE | re.MULTILINE)

当您像上面那样设置标志时,这意味着您要同时应用这两个设置,即 IGNORECASE 和 MULTILINE。

我想您对为什么这会同时应用这两种设置感到困惑。这是因为 python 重新解释器很有可能像下面这样处理:

if flags & re.IGNORECASE:
    handle_in_ignorecase_way()

if flags & re.MULTILINE:
    handle_in_multiline_way()

这就是为什么标志通常设置为 1、2、4、8 等模式的原因,因为重新解释器可以使用 & 和 | 轻松处理它们。当用户给出多个标志时。标志位于不同的位位置,可以通过简单的位破解来解析。