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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 08:57:15