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

Python使用re模块匹配所有Page标签内内容的技术问题

解决Python re模块匹配多个Page标签内容的问题

嘿,这个问题我太熟悉了!你碰到的是正则表达式里经典的贪婪匹配陷阱——默认情况下,正则会尽可能匹配最长的内容,所以你的代码才会从第一个[Page]一直抓到最后一个[/Page],把中间的标签也都包含进去了。

修复方案:非贪婪匹配 + 全局查找

要提取每个[Page]和[/Page]之间的独立内容,需要做两个关键调整:

  1. 把正则的贪婪匹配改成非贪婪匹配,在捕获组的量词后面加?,让正则遇到第一个闭合标签就停止匹配。
  2. 使用re.findall()或re.finditer()来全局查找所有匹配项,而不是re.match()(它只匹配字符串开头的内容)。

具体代码实现

首先修正你的正则表达式:

import re

# 开启非贪婪模式,去掉不必要的开头锚定^
page_pattern = re.compile(r'\[Page\]([\s\S]*?)\[\/Page\]', re.IGNORECASE)

这里[\s\S]*?的意思是:匹配任意字符(包括换行),但尽可能少匹配(非贪婪),直到遇到第一个[/Page]为止。

然后用findall()直接获取所有匹配的内容:

my_string = "[Page] # asdf [/Page] [Page] # Hello ## Woo [/Page]"
results = page_pattern.findall(my_string)

print(results)
# 输出结果:[' # asdf ', ' # Hello ## Woo ']

如果你需要更详细的匹配信息(比如匹配的位置),可以用finditer()遍历匹配对象:

for match in page_pattern.finditer(my_string):
    content = match.group(1)
    start_pos = match.start()
    end_pos = match.end()
    print(f"匹配到内容:'{content}',起始位置:{start_pos},结束位置:{end_pos}")

为什么原来的代码失效?

  • 你用了^锚定字符串开头,加上re.match()本身只匹配开头,这会导致如果字符串开头不是[Page]就完全匹配不到。
  • ([\S\s]*)是贪婪匹配,它会从第一个[Page]开始,一直匹配到最后一个[/Page]才停止,所以会把中间的[/Page] [Page]都包含进去,只返回一组结果。

内容的提问来源于stack exchange,提问作者Shahrukh Mohammad

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 06:31:30