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

时间:2014-12-15 10:43:34

标签: 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)

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

1 个答案:

答案 0 :(得分:8)

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对象。像six这样的模块可以帮助解决这个问题:

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)