Python文本解析函数调试:部分用例解析失败求助
Python文本解析函数问题排查与修复
任务要求
实现Python函数,将特定格式文本解析为字典:键为q(...)中的内容,值为loc @"..."中的字符串。
测试用例
- 正常输入1:
( [ loc @"edre"to q(isin_233);], [ loc @"bizaza" to q(ria_972); ], )
解析结果:{'isin_233': 'edre', 'ria_972': 'bizaza'}
- 正常输入2:
([ loc @"lage_187" to q(veinan_824);], [ loc @"axedi_678" toq(eddior_950); ], [loc @"zadies_990"to q(arxe_507);], [ loc @"usve_8"to q(bixeed_984); ], )
解析结果:{'veinan_824': 'lage_187','eddior_950': 'axedi_678','arxe_507': 'zadies_990','bixeed_984': 'usve_8'}
- 异常输入(现有代码无法解析):
([ loc @"lage_187" to q(veinan_824);], [ loc @"axedi_678" tonq(eddior_950); ], [loc @"zadies_990"to q(arxe_507);], [ loc @"usve_8"nto q(bixeed_984); ], )
现有代码
def main(s): d = {} elements = s.strip()[3:-3].split('], [') for elem in elements: loc, _, q = elem.strip().partition('to q(') loc = loc.strip()[6:-1] q = q[:-2].strip() if not q: continue if "\n" in q: q1, q2 = q.split("\n") q1 = q1.rstrip(");") q2 = q2.rstrip(");") q1 = q1[q1.rfind("(") + 1:] q2 = q2[q2.rfind("(") + 1:] d[q1] = loc.replace('@', '').replace('"', '') d[q2] = loc.replace('@', '').replace('"', '') else: q = q.rstrip(");") q = q[q.rfind("(") + 1:] d[q] = loc.replace('@', '').replace('"', '') return d
问题原因
现有代码依赖固定字符串to q(进行分割,但异常输入中出现了tonq((to与q(之间多字符n)、nto q((to前多字符n)等变体格式,导致分割失败,无法提取正确的loc和q内容。
修复方案
使用正则表达式匹配关键内容,灵活处理格式变体:
- 匹配每个
[ ... ]块 - 提取
loc @"xxx"中的xxx作为值 - 提取
q(yyy)中的yyy作为键,忽略to前后/中间的多余字符及空格变化
修复后的代码:
import re def main(s): result = {} # 匹配每个[ ... ]块 block_pattern = re.compile(r'\[.*?\]', re.DOTALL) # 匹配loc值:捕获loc @"xxx"中的xxx loc_pattern = re.compile(r'loc\s*@"([^"]+)"') # 匹配q键:捕获q(yyy)中的yyy,兼容nto/ton等变体 q_pattern = re.compile(r'(?:n?to|ton)\s*q\(([^)]+)\)') blocks = block_pattern.findall(s) for block in blocks: loc_match = loc_pattern.search(block) if not loc_match: continue loc_value = loc_match.group(1) # 提取当前块中所有q键 q_matches = q_pattern.findall(block) for q_key in q_matches: result[q_key.strip()] = loc_value.strip() return result
测试验证
运行修复后的代码,输入异常测试用例,可得到正确结果:{'veinan_824': 'lage_187', 'eddior_950': 'axedi_678', 'arxe_507': 'zadies_990', 'bixeed_984': 'usve_8'}
内容的提问来源于stack exchange,提问作者pusat
相关产品推荐
相关产品推荐

