我在python3.4中使用了以下表达式,它给出了语法错误,但相同的代码在python2.7中仍然有效
block = re.compile(ur'DATA(value)[S ]+s((?:(?![^
]+DATA(value2)).)*)', re.IGNORECASE | re.DOTALL)
我不确定此表达式中的真正问题是什么
Python3没有ur'...'
原始Unicode字符串语法。请改用r'...'
:
block = re.compile(
r'DATA(value)[S ]+s((?:(?![^
]+DATA(value2)).)*)',
re.IGNORECASE | re.DOTALL)
如果您需要创建与Python交叉兼容的代码,则必须使用条件代码将r'...'
生成的字节串解码为仅在Python2上的unicode
对象。类似six
的模块可以帮助实现这一点:
from six import u
block = re.compile(
u(r'DATA(value)[S ]+s((?:(?![^
]+DATA(value2)).)*)'),
re.IGNORECASE | re.DOTALL)
或者您可以创建自己的兼容层;对于本地一次性测试,您可以查看是否存在str.decode()
方法:
_block_pattern = r'DATA(value)[S ]+s((?:(?![^
]+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)