Python正则表达式出现unexpected end of pattern错误求助
解决Python中HTML递归正则匹配的报错问题
这个问题我之前也碰到过,核心原因是Python标准库的re模块不支持(?R)这种PCRE风格的递归语法——你在RegExr和regex101上测试用的是PCRE引擎,所以能正常运行,但Python的re解析到(?R)时会直接报错"unexpected end of pattern",因为它根本不认识这个语法。
下面给你两种可行的解决办法:
方法一:使用支持PCRE语法的第三方regex库
Python有个第三方库regex,完全兼容PCRE的语法,包括(?R)递归。你只需要做两步:
- 先安装库:
pip install regex
- 替换代码里的
re模块为regex,同时简化正则里的转义(原始字符串里可以直接用<和>,不用转义成\<和\>):
import regex # 简化后的正则,去掉不必要的转义 pattern = r'<([\w]+)([^>]*?)(([\s]*\/>)|(>((([^<]*?|<!--.*?-->)|(?R))*)<\/\1[\s]*>))' matches = regex.finditer(pattern, data)
这样就能和你在RegExr上的效果完全一致了。
方法二:修改正则适配Python原生re模块
如果你不想引入第三方库,可以把正则改成Pythonre支持的递归形式——用**命名捕获组+(?P=组名)**来实现递归,而不是(?R)。修改后的正则如下:
import re # 用命名组实现递归,适配Python re模块 pattern = r'(?P<html_tag><(?P<tag_name>\w+)([^>]*?)((\s*\/>)|(>((([^<]*?|<!--.*?-->)|(?P=html_tag))*)<\/(?P=tag_name)\s*>)))' matches = re.finditer(pattern, data)
这里我们把整个HTML标签的匹配逻辑命名为html_tag,递归时用(?P=html_tag)引用这个组;同时把标签名命名为tag_name,确保闭合标签和起始标签一致,逻辑和你原来的正则完全等价。
内容的提问来源于stack exchange,提问作者David Callanan
相关产品推荐
相关产品推荐

