Python正则解析Yahoo模拟选秀聊天生成DataFrame时遗漏数据
解决Yahoo梦幻选秀聊天字符串正则匹配遗漏行的问题
问题原因
你的正则表达式中用于匹配球员姓名的捕获组([\w\s-]+?)仅支持字母、数字、下划线、空格和连字符,但球员姓名里的点号(.)不在匹配范围内——比如"A. St. Brown"中的两个点,导致该行无法被正则引擎识别,最终被遗漏。
修复方案
修改正则里的姓名匹配规则,把[\w\s-]替换为[\w\s.-],加入对点号的支持,其余逻辑保持不变即可。
修改后的完整函数代码
import pandas as pd import re def parse_draft_data(data_string): team_abrev = ["Ari","Atl","Bal","Buf","Car","Chi","Cin","Cle","Dal","Den","Det","GB","Hou","Ind","Jax","KC","LAC","LAR","LV","Mia","Min","NE","NO","NYG","NYJ","Phi","Pit","Sea","SF","TB","Ten","Was"] pos_abrev = ["QB", "RB", "WR", "TE", "K", "DEF"] # 关键修改:在姓名匹配字符集中添加.符号 pattern = r"(\d+)(?:th|st|nd|rd)?(?:([A-Z])\.\s*)?([\w\s.-]+?)\s*(" + "|".join(team_abrev) + r")\s*-\s*(" + "|".join(pos_abrev) + r")" matches = re.findall(pattern, data_string) data = { "draft_num": [], "first_initial": [], "last_name": [], "team": [], "pos": [] } for match in matches: draft_num, first_initial, last_name, team, pos = match data["draft_num"].append(int(draft_num)) data["first_initial"].append(first_initial if first_initial else None) data["last_name"].append(last_name.strip()) data["team"].append(team) data["pos"].append(pos) df = pd.DataFrame(data) df["team"] = df["team"].str.strip() return df
测试结果
用修改后的函数处理样本输入,输出会包含之前遗漏的行:
draft_num first_initial last_name team pos 0 12 J Jacobs LV RB 1 13 S Diggs Buf WR 2 14 D Adams LV WR 3 19 A St. Brown Det WR 4 97 J Smith-Njigba Sea WR 5 120 None Miami Mia DEF
额外优化建议
- 可以给球队缩写的匹配部分加上
\b单词边界,修改为r"\b(" + "|".join(team_abrev) + r")\b",避免和姓名末尾的字母意外匹配,提升匹配准确性。 - 如果存在含撇号的姓名(比如O'Neal),可以把字符集扩展为
[\w\s.-']。
内容的提问来源于stack exchange,提问作者Nicholas Wood
相关产品推荐
相关产品推荐

