代码之家  ›  专栏  ›  技术社区  ›  dguan

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

  •  4
  • dguan  · 技术社区  · 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', '+', '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个部分?

    1 回复  |  直到 7 年前
        1
  •  4
  •   Tomalak    7 年前

    添加了按零长度匹配进行拆分的功能 re.split() \s+ 而不是 \s* ,该行为将与3.7+中的预期一样(在Python中保持不变<3.7):

    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']
    

    这个 regex 模块,用于替换 re ,具有“V1”模式,使现有模式的行为与Python 3.7之前的模式相同(请参阅 this answer ).