【发布时间】:2019-05-04 07:34:22
【问题描述】:
我有一个在 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 中,part 中的每个字符都会被拆分成一个单独的部分,被移除的空格(包括不存在的前导和尾随)会变成一个空的部分('')并被添加到该部分中列表。
我认为这个 Python 3 正则表达式的行为与 Python 2 有很大的不同,谁能告诉我 Python 3 会发生如此大变化的原因,以及像 Python 2 中那样将表达式分成 5 个部分的正确正则表达式是什么?
【问题讨论】:
-
无论如何分割一个可能为零长度的模式都是错误的。不知道 Python2 如何做到你所说的。请改用
r'\s+'。 -
它的工作方式与 3.6 版中的 python2 类似,尽管它会警告非空模式匹配,但是是的,使用 split(r'^\s+',
-
@o11c 对非零长度模式进行拆分并不是“错误的”,它是一个非常有用的工具。 Python 不支持这一点的事实是最糟糕的设计决策,luckily got revised in Python 3.7.
标签: python regex python-3.x python-2.7