какая разница между операторами при использовании нескольких re.FLAG - PullRequest
1 голос
/ 07 марта 2019

есть 3 шаблона регулярных выражений, как показано ниже.

r1=re.compile(r"""
    # com
    abc
    # tehis
    \s+\d+
    """, re.S|re.X)

r2=re.compile(r"""
    # com
    abc
    # tehis
    \s+\d+
    """, re.S+re.X)  

r3=re.compile(r"""
    # com
    abc
    # tehis
    \s+\d+
    """, re.S&re.X)

и строка для сопоставления аналогична.

>>> s
'abc\n    899'

результат поиска и соответствия показан ниже.

>>> s
'abc\n    899'
>>> r1.findall(s)
['abc\n    899']
>>> r2.findall(s)
['abc\n    899']
>>> r3.findall(s)
[]

мы видим, что r3 соответствует неудачно, а r1 и r2 успешно. Так в чем же разница между различными операторами при использовании нескольких re.FLAGS?

1 Ответ

1 голос
/ 07 марта 2019

Флаги re, такие как re.I, представляются целочисленными значениями. Но они интерпретируются как двоичные битовые маски. Итак, вот что ваши маски на самом деле равны:

re.S | re.X = 80
re.S + re.X = 80
re.S & re.X = 0

Вот значение 80 в двоичном виде:

1010000

А вот значения для re.S (64) и re.X (16) в двоичном виде:

re.S = 1000000
re.X = 0010000
       1010000 <--- 80 in decimal

Сверху должно быть ясно, что re.S | re.X и re.S + re.X случайно покрывают биты обоих флагов, а re.S & re.X - нет. В этом случае целочисленное сложение + и побитовое ИЛИ | дают одинаковый результат.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...