Python按空行分割解析玩家列表与对战轮次数据的实现方法
Python空行分隔对战记录解析实现
核心实现步骤
- 拆分顶级内容块:先去除原始输入首尾空白,用正则匹配连续空行做分隔符,把输入拆成多个独立内容块,拆分逻辑兼容空行夹带空格、制表符的异常格式。
- 提取玩家列表:拆分得到的第一个内容块是玩家名单,按换行逐行切分,去除每行首尾空白、过滤空行后得到完整玩家列表,可直接赋值给
result类的name属性。 - 提取对战轮次:第一个块之后的所有内容块,每个块对应一个独立对战轮次;每个轮次块按换行切分,逐行去空白、过滤空行后,每行对应一场对战记录。
- 解析单场对战:每场对战行按空白字符切分字段,前两个字段为对战双方名称,后两个字段转为浮点数类型,分别映射为
player_1、player_2、score_player_1、score_player_2即可。
可直接运行的代码示例
import re # 原始输入 input_content = """Andrew Bob Chanel Danielle Andrew Chanel 1 0 Danielle Bob 0 1 Andrew Danielle 0.5 0.5 Chanel Bob 1 0 Andrew Bob 0.5 0.5 Chanel Danielle""" # 按空行拆分所有顶级块,自动过滤空块 blocks = [b.strip() for b in re.split(r'\n\s*\n', input_content.strip()) if b.strip()] # 1. 提取玩家列表 player_list = [name.strip() for name in blocks[0].split('\n') if name.strip()] # 类属性赋值示例:result.name = player_list # 2. 提取并解析所有轮次、对战数据 all_rounds = [] for round_order, round_block in enumerate(blocks[1:], start=1): match_lines = [line.strip() for line in round_block.split('\n') if line.strip()] round_matches = [] for line in match_lines: fields = line.split() # 兼容示例中最后一行无比分的未完成对战场景,可按需调整 if len(fields) < 4: round_matches.append({ "player_1": fields[0], "player_2": fields[1], "score_player_1": None, "score_player_2": None }) continue p1_name, p2_name, s1, s2 = fields round_matches.append({ "player_1": p1_name, "player_2": p2_name, "score_player_1": float(s1), "score_player_2": float(s2) }) all_rounds.append({ "round_seq": round_order, "match_list": round_matches }) # 验证输出 print("参与玩家:", player_list) print("各轮次对战解析结果:", all_rounds)
注意事项
- 不要直接用
split('\n\n')拆分空行,该写法无法识别夹带空格、制表符的不规范空行,用正则r'\n\s*\n'做分隔符兼容性更强。 - 比分字段统一转
float类型,不要转int,否则遇到0.5的平局记录会抛出转换错误。 - 代码里对字段不足的对战行做了空值兼容,你可以根据实际业务需求调整校验、报错逻辑。
内容的提问来源于stack exchange,提问作者AndrewRed
相关产品推荐
相关产品推荐

