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

Python正则分组提取特定格式下的RANDOMSTRING数组

问题描述

咱们有一段带特定标记的文本,其中=E2=80=A2是分组的分隔符,需要把每个分隔符后面的RANDOMSTRING提取出来,整理成嵌套数组的格式。具体情况如下:

  • 输入文本示例(简化后):
RANDOMSTRING $RANDOMFLOAT Paid with Visa ending in RANDOMINT *- For: RANDOMSTRING -* RANDOMINTx *RANDOMSTRING* (RANDOMSTRING) =E2=80=A2 RANDOMSTRING1 $RANDOMFLOAT RANDOMINTx RANDOMSTRING (RANDOMSTRING) =E2=80=A2 RANDOMSTRING2 =E2=80=A2 RANDOMSTRING3 =E2=80=A2 RANDOMSTRING4 =E2=80=A2 RANDOMSTRING5 $RANDOMFLOAT RANDOMINTx *RANDOMSTRING* (RANDOMSTRING) =E2=80=A2 RANDOMSTRING6 =E2=80=A2 RANDOMSTRING7 $RANDOMFLOAT RANDOMINTx *RANDOMSTRING* (RANDOMSTRING) =E2=80=A2 RANDOMSTRING8 =E2=80=A2 RANDOMSTRING9 
  • 想要的输出:
[[RANDOMSTRING1], [RANDOMSTRING2, RANDOMSTRING3, RANDOMSTRING4, RANDOMSTRING5], [RANDOMSTRING6, RANDOMSTRING7], [RANDOMSTRING8, RANDOMSTRING9]]
  • 当前遇到的问题:用正则re.findall("((=E2=80=A2 .*$)|\n\n)", bodytext, re.MULTILINE)跑出来的是元组数组,完全不是我们要的结构。
解决方案

先说说原来的正则为啥不行哈:一是用了多层捕获组,findall遇到捕获组就会返回元组;二是匹配逻辑太宽泛,没精准定位到我们要的RANDOMSTRING,也没处理好分组的边界。

咱们换个思路,先把文本按组块拆分,再在每个组块里提取目标内容,具体代码如下:

import re

# 假设这是你的输入文本
bodytext = "RANDOMSTRING $RANDOMFLOAT Paid with Visa ending in RANDOMINT *- For: RANDOMSTRING -* RANDOMINTx *RANDOMSTRING* (RANDOMSTRING) =E2=80=A2 RANDOMSTRING1 $RANDOMFLOAT RANDOMINTx RANDOMSTRING (RANDOMSTRING) =E2=80=A2 RANDOMSTRING2 =E2=80=A2 RANDOMSTRING3 =E2=80=A2 RANDOMSTRING4 =E2=80=A2 RANDOMSTRING5 $RANDOMFLOAT RANDOMINTx *RANDOMSTRING* (RANDOMSTRING) =E2=80=A2 RANDOMSTRING6 =E2=80=A2 RANDOMSTRING7 $RANDOMFLOAT RANDOMINTx *RANDOMSTRING* (RANDOMSTRING) =E2=80=A2 RANDOMSTRING8 =E2=80=A2 RANDOMSTRING9 "

final_result = []

# 第一步:匹配每个完整的组块,组块从=E2=80=A2开始,直到遇到$RANDOMFLOAT或者文本结尾
for group_match in re.finditer(r'=E2=80=A2 (.+?)(?= \$RANDOMFLOAT|$)', bodytext, re.DOTALL):
    # 拿到当前组块的内容
    group_content = group_match.group(1)
    # 第二步:从组块里提取所有的RANDOMSTRING(包括开头第一个和后续用=E2=80=A2分隔的)
    items_in_group = re.findall(r'(?:^|=E2=80=A2 )([A-Za-z0-9 ]+)', group_content)
    # 把提取到的内容加入最终结果
    final_result.append(items_in_group)

print(final_result)

代码逻辑解释

  1. 拆分组块:用re.finditer配合正向预查(?=...),精准定位每个组的边界——每个组从=E2=80=A2开始,要么到 $RANDOMFLOAT结束(因为这是下一个组的前置标记),要么到文本结尾。
  2. 提取组内内容:对每个组块,用正则提取所有的RANDOMSTRING——不管是组开头的第一个,还是后续用=E2=80=A2 分隔的,都能一网打尽。
  3. 整理成嵌套数组:把每个组的结果作为子数组,最终组合成我们想要的格式。

这样跑出来的结果就完全符合需求啦,不会再出现元组的问题,而且分组精准。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 06:48:22