如何提取多行字符串中基于子串的分组及生成关联配对列表?
问题描述
现有如下格式的多行字符串:
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)。需要实现两个目标:
- 识别此类关联配对,生成如下字典:
{'mno123':'pqr123', 'abc123':'def123', 'tyu123':'ijk123'}
- 基于该字典,将对应行分组,得到类似如下的分组列表:
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
相关产品推荐
相关产品推荐

