在Python3.4中使用正则表达式的语法无效语法、正则表达式

2023-09-04 02:07:23 作者:红鸢

我在python3.4中使用了以下表达式,它给出了语法错误,但相同的代码在python2.7中仍然有效

block = re.compile(ur'DATA(value)[S ]+s((?:(?![^
]+DATA(value2)).)*)', re.IGNORECASE | re.DOTALL)

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

推荐答案

python程序化设计正则表达式语法 基于python的正则表达式学习笔记

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)