Python 2与3正则表达式的差异

Python 2与3正则表达式的差异,python,regex,python-3.x,python-2.7,Python,Regex,Python 3.x,Python 2.7,我有一个正则表达式,它在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',

我有一个正则表达式,它在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'],
等等

但是在Python3中,这个正则表达式的工作方式完全不同

'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', ''],
通常,在Python3中,一个部分中的每个字符都将被拆分为一个单独的部分,删除的空格(不包括任何现有的前导和尾随)将成为一个空部分(“”),并将添加到部分列表中


我认为Python3的正则表达式行为与Python2有很大的不同,有谁能告诉我Python3为什么会发生如此大的变化,以及什么是正确的正则表达式,可以像Python2那样将表达式拆分为5个部分?

Python3.7中的
re.split()
添加了零长度匹配拆分功能。当您将拆分模式更改为
\s+
而不是
\s*
时,该行为将与3.7+中的预期一样(在Python<3.7中保持不变):

测试:


regex
模块是
re
的替代品,它有一个“V1”模式,使现有模式的行为与Python 3.7之前的模式类似(请参见)。

在可能为零长度的模式上拆分是错误的。不知道Python2是怎么做到你说的。改为使用
r'\s+'
。它的工作原理类似于3.6版中的python2,尽管它警告非空模式匹配,但是的,使用split(r'^\s+'),@o11c对非零长度模式进行拆分并不是“错误的”,它是一个非常有用的工具。事实上,Python不支持这是一个糟糕的设计决策,而不是其他任何东西。
def parts(string)
    return re.split(r'\s+', re.sub(r'^\s+|\s*$', '', string))
>>> 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']