了解正则表达式标志和按位运算符
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 等模式的原因,因为重新解释器可以使用 & 和 | 轻松处理它们。当用户给出多个标志时。标志位于不同的位位置,可以通过简单的位破解来解析。
我正在尝试了解所有正则表达式标志和按位是如何联系在一起的。我唯一能真正找到与此相关的是在 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 等模式的原因,因为重新解释器可以使用 & 和 | 轻松处理它们。当用户给出多个标志时。标志位于不同的位位置,可以通过简单的位破解来解析。