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)
代码逻辑解释
- 拆分组块:用
re.finditer配合正向预查(?=...),精准定位每个组的边界——每个组从=E2=80=A2开始,要么到$RANDOMFLOAT结束(因为这是下一个组的前置标记),要么到文本结尾。 - 提取组内内容:对每个组块,用正则提取所有的
RANDOMSTRING——不管是组开头的第一个,还是后续用=E2=80=A2分隔的,都能一网打尽。 - 整理成嵌套数组:把每个组的结果作为子数组,最终组合成我们想要的格式。
这样跑出来的结果就完全符合需求啦,不会再出现元组的问题,而且分组精准。
内容的提问来源于stack exchange,提问作者leo
相关产品推荐
相关产品推荐

