Python 2 против 3 Regex разница - PullRequest
       0

Python 2 против 3 Regex разница

0 голосов
/ 03 декабря 2018

У меня есть регулярное выражение, которое отлично работает в Python 2:

parts = re.split(r'\s*', re.sub(r'^\s+|\s*$', '', expression)) # split expression into 5 parts

это регулярное выражение разделит выражение на 5 частей, например,

'a * b   =     c' will be split into ['a', '*', 'b', '=', 'c'],
'11 + 12 = 23' will be split into ['11', '+', '12', '=', '23'],
'ab   - c = d' will be split into ['ab', '-', 'c', '=', 'd'],

и т. Д.

Но в Python 3 это регулярное выражение работает совсем по-другому,

'a * b   =     c' will be split into ['', 'a','', '*', '', 'b','', '=', '',  'c', ''],
'11 + 12 = 23' will be split into ['', '1', '1', '', '+', '', '1', '2', '', '=', '', '2', '3', ''],
'ab   - c = d' will be split into ['', 'a', 'b', '', '-', '', 'c', '', '=', '', 'd', ''],

В общем, в Python 3 каждый символ в части будет разделен на отдельную часть и удален пробелами (включая отсутствие существующих ведущих).и завершающий) станет пустой частью ('') и будет добавлен в список частей.

Я думаю, что это поведение регулярных выражений Python 3 отличается довольно сильно от Python 2, может кто-нибудь сказать мне причину, почему Python 3сильно изменится, и что такое правильное регулярное выражение для разбиения выражения на 5 частей, как в Python 2?

1 Ответ

0 голосов
/ 03 декабря 2018

Возможность разделения на совпадения нулевой длины была добавлена ​​в re.split() в Python 3.7.Когда вы изменяете свой шаблон разделения на \s+ вместо \s*, поведение будет таким, как ожидалось в 3.7+ (и неизменным в Python <3.7): </p>

def parts(string)
    return re.split(r'\s+', re.sub(r'^\s+|\s*$', '', string))

test:

>>> print(parts('a * b   =     c'))
['a', '*', 'b', '=', 'c']
>>> print(parts('ab   - c = d'))
['ab', '-', 'c', '=', 'd']
>>> print(parts('a * b   =     c'))
['a', '*', 'b', '=', 'c']
>>> print(parts('11 + 12 = 23'))
['11', '+', '12', '=', '23']

Модуль regex, заменяющий re, имеет режим "V1", который заставляет существующие шаблоны вести себя так же, как и до Python 3.7 (см. этот ответ ).

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