我在python 3.4中使用以下表达式,它提供语法错误,但相同的代码在python 2.7中工作
block = re.compile(ur'DATA\(value\)[\S ]+\s((?:(?![^\n]+DATA\(value2\)).)*)', re.IGNORECASE | re.DOTALL)
我不确定这个表达式中的真正问题是什么
答案 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)