Python positive-lookbehind split variable-width

Я, однако, что я правильно настроил выражение, но раскол не работает должным образом.

c = re.compile(r'(?<=^\d\.\d{1,2})\s+');
for header in ['1.1 Introduction', '1.42 Appendix']: print re.split(c, header)

Ожидаемый результат:

['1.1', 'Introduction']
['1.42', 'Appendix']

Я получаю следующую стек:

Traceback (последний последний вызов): Файл "foo.py", строка 1, в c = re.compile(r '(? <= ^\d.\d {1,2})\s+'); Файл "C:\Python27\lib\re.py" , строка 190, в компиляции return _compile (шаблон, флаги) Файл "C:\Python27\lib\re.py" , строка 242, в _compile ошибка повышения, v # недопустимое выражение sre_constants.error: look-behind требует шаблона с фиксированной шириной <<< Процесс закончен. (Код выхода 1)

3 ответа

Lookbehinds в python не может быть переменной ширины, поэтому ваш lookbehind недействителен.

Вы можете использовать группу захвата в качестве обходного пути:

c = re.compile(r'(^\d\.\d{1,2})\s+');
for header in ['1.1 Introduction', '1.42 Appendix']: print re.split(c, header)[1:] # Remove the first element because it empty

Вывод:

['1.1', 'Introduction']
['1.42', 'Appendix']


ваша ошибка в регулярном выражении находится в части {1,2} потому что Lookbehinds должны быть фиксированной шириной, поэтому квантификаторы не допускаются.

попробуйте этот сайт, чтобы проверить ваше регулярное выражение, прежде чем вводить его в код.

НО в вашем случае вам не нужно использовать регулярное выражение вообще:

просто попробуйте это:

for header in ['1.1 Introduction', '1.42 Appendix']: print header.split(' ')

результат:

['1.1', 'Introduction']
['1.42', 'Appendix']

надеюсь это поможет.


Мое решение может выглядеть хромым. Но вы проверяете только две цифры после точки. Таким образом, вы можете использовать два lookbehind.

c = re.compile(r'(?:(?<=^\d\.\d\d)|(?<=^\d\.\d))\s+');

licensed under cc by-sa 3.0 with attribution.