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)
我不确定这个表达式中的真正问题是什么
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)