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

如何提取多行字符串中基于子串的分组及生成关联配对列表?

问题描述

现有如下格式的多行字符串:

abcdef-001a.mno123.xyz.com
abcdef-001b.mno123.xyz.com
abcdef-001a.pqr123.xyz.com
abcdef-001b.pqr123.xyz.com
lkjh-001a.abc123.xyz.com
lkjh-001b.abc123.xyz.com
lkjh-001a.def123.xyz.com
lkjh-001b.def123.xyz.com
mnbg-001a.tyu123.xyz.com
mnbg-001b.tyu123.xyz.com
mnbg-001a.ijk123.xyz.com
mnbg-001b.ijk123.xyz.com

使用正则表达式 (.*)\.(.*)\.xyz\.com 可匹配每行,其中group1(比如abcdef-001a)会关联多个group2(比如mno123和pqr123)。需要实现两个目标:

  1. 识别此类关联配对,生成如下字典:
{'mno123':'pqr123', 'abc123':'def123', 'tyu123':'ijk123'}
  1. 基于该字典,将对应行分组,得到类似如下的分组列表:
output2_list1:
abcdef-001a.mno123.xyz.com
abcdef-001b.mno123.xyz.com

output2_list2:
abcdef-001a.pqr123.xyz.com
abcdef-001b.pqr123.xyz.com

output2_list3:
lkjh-001a.abc123.xyz.com
lkjh-001b.abc123.xyz.com

output2_list4:
lkjh-001a.def123.xyz.com
lkjh-001b.def123.xyz.com

output2_list5:
mnbg-001a.tyu123.xyz.com
mnbg-001b.tyu123.xyz.com

output2_list6:
mnbg-001a.ijk123.xyz.com
mnbg-001b.ijk123.xyz.com

要求方案支持处理大量此类行及多组group1关联group2的场景。

解决方案

步骤1:生成关联配对字典

核心逻辑是先按group1聚合对应的group2集合,再将每个group1对应的group2两两配对(假设每个group1对应且仅对应2个group2)。

Python实现代码:

import re

# 原始多行文本(实际场景可从文件读取)
lines = """abcdef-001a.mno123.xyz.com
abcdef-001b.mno123.xyz.com
abcdef-001a.pqr123.xyz.com
abcdef-001b.pqr123.xyz.com
lkjh-001a.abc123.xyz.com
lkjh-001b.abc123.xyz.com
lkjh-001a.def123.xyz.com
lkjh-001b.def123.xyz.com
mnbg-001a.tyu123.xyz.com
mnbg-001b.tyu123.xyz.com
mnbg-001a.ijk123.xyz.com
mnbg-001b.ijk123.xyz.com""".split('\n')

pattern = re.compile(r'(.*)\.(.*)\.xyz\.com')
# 按group1聚合去重后的group2
group1_to_group2 = {}
for line in lines:
    match = pattern.match(line)
    if match:
        g1, g2 = match.groups()
        group1_to_group2.setdefault(g1, set()).add(g2)

# 生成配对字典
pair_dict = {}
for g2_set in group1_to_group2.values():
    g2_list = list(g2_set)
    if len(g2_list) == 2:
        pair_dict[g2_list[0]] = g2_list[1]
        # 若需要双向映射,可添加:pair_dict[g2_list[1]] = g2_list[0]

print("Output1:")
print(pair_dict)

运行后会输出目标字典,若需固定配对顺序,可对g2_list进行排序。

步骤2:基于字典分组行

先按group2聚合所有行,再根据配对字典的逻辑输出分组结果:

# 按group2聚合所有行
group2_to_lines = {}
for line in lines:
    match = pattern.match(line)
    if match:
        g2 = match.group(2)
        group2_to_lines.setdefault(g2, []).append(line)

# 输出分组结果
print("\nOutput2:")
list_num = 1
processed = set()

# 处理配对的group2
for g2, paired_g2 in pair_dict.items():
    if g2 not in processed:
        print(f"\noutput2_list{list_num}:")
        print('\n'.join(group2_to_lines[g2]))
        list_num += 1
        print(f"\noutput2_list{list_num}:")
        print('\n'.join(group2_to_lines[paired_g2]))
        list_num += 1
        processed.add(g2)
        processed.add(paired_g2)

# 处理剩余未配对的group2(若存在)
for g2 in group2_to_lines:
    if g2 not in processed:
        print(f"\noutput2_list{list_num}:")
        print('\n'.join(group2_to_lines[g2]))
        list_num += 1

该方案所有聚合操作均为O(n)时间复杂度,可高效处理大量行数据。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 17:24:55