在python 3.4中使用正则表达式的语法无效

use*_*r89 3 python regex python-3.x python-3.4

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

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

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

Mar*_*ers 9

Python 3没有ur'...'原始的unicode字符串语法.r'...'改为使用:

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

如果你需要创建交叉的Python兼容的代码,你将不得不使用条件代码将通过解码生成的字节串r'...'unicode只对Python的2样模块对象six可以与帮助:

from six import u

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

或者您可以创建自己的兼容层; 对于本地一次性测试,您可以看到是否存在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)
Run Code Online (Sandbox Code Playgroud)