You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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)递归。你只需要做两步:

  1. 先安装库:
pip install regex
  1. 替换代码里的re模块为regex,同时简化正则里的转义(原始字符串里可以直接用<和>,不用转义成\&lt;和\&gt;):
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 08:22:07