【问题标题】:Invalid syntax using regular expression in python 3.4在 python 3.4 中使用正则表达式的语法无效
【发布时间】:2014-12-15 10:43:34
【问题描述】:

我在 python 3.4 中使用以下表达式,它给出 语法错误,但相同的代码在 python 2.7 中有效

block = re.compile(ur'DATA\(value\)[\S ]+\s((?:(?![^\n]+DATA\(value2\)).)*)', re.IGNORECASE | re.DOTALL)

我不确定这个表达式的真正问题是什么

【问题讨论】:

    标签: python regex python-3.x python-3.4


    【解决方案1】:

    Python 3 没有 ur'...' 原始 unicode 字符串语法。请改用r'...'

    block = re.compile(
        r'DATA\(value\)[\S ]+\s((?:(?![^\n]+DATA\(value2\)).)*)',
        re.IGNORECASE | re.DOTALL)
    

    如果您需要创建跨 Python 兼容的代码,则必须使用条件代码将 r'...' 生成的字节字符串解码为仅在 Python 2 上的 unicode 对象。像 @987654321 这样的模块@ 可以提供帮助:

    from six import u
    
    block = re.compile(
        u(r'DATA\(value\)[\S ]+\s((?:(?![^\n]+DATA\(value2\)).)*)'),
        re.IGNORECASE | re.DOTALL)
    

    或者您可以创建自己的兼容层;对于本地一次性测试,您可以查看是否存在 str.decode() 方法:

    _block_pattern = r'DATA\(value\)[\S ]+\s((?:(?![^\n]+DATA\(value2\)).)*)'
    if hasattr(_block_pattern, 'decode'):
        # Python 2, decode to unicode first
        _block_pattern = _block_pattern.decode('ascii')
    block = re.compile(_block_pattern, re.IGNORECASE | re.DOTALL)
    

    【讨论】:

      猜你喜欢
      • 2015-10-10
      • 1970-01-01
      • 2019-01-05
      • 2019-07-26
      • 1970-01-01
      • 2013-05-12
      • 2020-08-11
      • 2011-08-09
      • 2012-05-10
      相关资源
      最近更新 更多