Регулярное выражение Python findall поведение чередования

Я использую Python 2.7.6. Я не могу понять следующий результат от re.findall:

>>> re.findall('\d|\(\d,\d\)', '(6,7)')
['(6,7)']

Я ожидал, что вышеприведенное вернет ['6', '7'], потому что согласно документации:

'|'

A|B, где A и B могут быть произвольными RE, создает регулярное выражение, которое будет соответствовать либо A, либо B. Произвольное количество RE может быть разделено символом '|' этим способом. Это также можно использовать внутри групп (см. ниже). Когда целевая строка сканируется, RE, разделенные символом '|' пробуют слева направо. Когда один шаблон полностью совпадает, эта ветвь принимается. Это означает, что как только A совпадет, B не будет подвергаться дальнейшему тестированию, даже если это приведет к более длительному общему совпадению. Другими словами, '|' оператор никогда не жадничает. Чтобы сопоставить литерал '|', используйте \| или заключите его в класс символов, как в [|].

Спасибо за вашу помощь


person Mayank    schedule 16.07.2015    source источник
comment
n [4]: re.findall(r'\d|\d,\d\)', '(6,7)') Out[4]: ['6', '7'] Удивительно, какая разница в (, а? Сначала было найдено возможное совпадение для второй вещи, так что это то, что совпало.   -  person NightShadeQueen    schedule 17.07.2015
comment
@hwnd Пример надуманный, я пытаюсь понять здесь ожидаемое поведение.   -  person Mayank    schedule 17.07.2015
comment
RE, разделенные '|' пробуют слева направо. Может быть, это означает слева направо в строке? В этом случае ( находится левее первой цифры.   -  person tobias_k    schedule 17.07.2015


Ответы (1)


Как указано в документе:

Это означает, что как только A совпадет, B больше не будет тестироваться, даже если это приведет к более длительному общему совпадению.

Таким образом, в этом случае механизм регулярных выражений не соответствует \d, потому что ваша строка помечена (, а не \d, поэтому она будет соответствовать второму случаю, который равен \(\d,\d\). Но если ваша строка начинается с \d, она будет соответствовать \d:

>>> re.findall('\d|\d,\d\)', '6,7)')
['6', '7']
person kasravnd    schedule 16.07.2015
comment
Понимание приходит..:) Спасибо. - person Mayank; 17.07.2015