Ошибка с функцией re.split и флагом re.DOTALL в модуле re Python 2.7.1 - PullRequest
7 голосов
/ 12 ноября 2011

У меня Mac под управлением Lion и Python 2.7.1. Я заметил кое-что очень странное из модуля re. Если я запускаю следующую строку:

print re.split(r'\s*,\s*', 'a, b,\nc, d, e, f, g, h, i, j, k,\nl, m, n, o, p, q, r')

Я получаю этот результат:

['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r']

Но если я запускаю его с флагом re.DOTALL, как это:

print re.split(r'\s*,\s*', 'a, b,\nc, d, e, f, g, h, i, j, k,\nl, m, n, o, p, q, r', re.DOTALL)

Тогда я получаю такой результат:

['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q, r']

Обратите внимание, что 'q, r' считается одним совпадением вместо двух.

Почему это происходит? Я не понимаю, почему флаг re.DOTALL будет иметь значение, если я не использую точки в своем шаблоне. Я что-то не так делаю или есть какая-то ошибка?

1 Ответ

13 голосов
/ 12 ноября 2011
>>> s = 'a, b,\nc, d, e, f, g, h, i, j, k,\nl, m, n, o, p, q, r'
>>> re.split(r'\s*,\s*', s)
['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r']
>>> re.split(r'\s*,\s*', s, maxsplit=16)
['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q, r']
>>> re.split(r'\s*,\s*', s, flags=re.DOTALL)
['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r']

Проблема в том, что вы передаете re.DOTALL позиционно, где он устанавливает аргумент maxsplit=0, а не flags=0. re.DOTALL бывает постоянной 16.

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