【问题标题】:Invalid syntax using regular expression in python 3.4在 python 3.4 中使用正则表达式的语法无效
【发布时间】:2014-12-15 10:43:34
【问题描述】:
我在 python 3.4 中使用以下表达式,它给出 语法错误,但相同的代码在 python 2.7 中有效
block = re.compile(ur'DATA\(value\)[\S ]+\s((?:(?![^\n]+DATA\(value2\)).)*)', re.IGNORECASE | re.DOTALL)
我不确定这个表达式的真正问题是什么
【问题讨论】:
标签:
python
regex
python-3.x
python-3.4
【解决方案1】:
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 对象。像 @987654321 这样的模块@ 可以提供帮助:
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)