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

Python中pyparsing扫描结果的索引访问疑问解析

关于pyparsing scanString返回结果的索引规则

示例文件内容

myheader.h

#define MACRO1 42
#define lang_init ()  c_init()
#define min(X, Y)  ((X) < (Y) ? (X) : (Y))

pyparser.py

from pyparsing import *
# define the structure of a macro definition (the empty term is used 
# to advance to the next non-whitespace character)
macroDef = "#define" + Word(alphas+"_",alphanums+"_").setResultsName("macro") + \
            empty + restOfLine.setResultsName("value")
with open('myheader.h', 'r') as f:
    res = macroDef.scanString(f.read())
    res = list(res)
    print(res[0])
    print(res[1])
    print(res[2])

执行输出结果

((['#define', 'MACRO1', '42'], {'macro': ['MACRO1'], 'value': ['42']}), 0, 17)
((['#define', 'lang_init', '()  c_init()'], {'macro': ['lang_init'], 'value': ['()  c_init()']}), 18, 48)
((['#define', 'min', '(X, Y)  ((X) < (Y) ? (X) : (Y))'], {'macro': ['min'], 'value': ['(X, Y)  ((X) < (Y) ? (X) : (Y))']}), 49, 91)

问题解答

你误解了res的结构:

  • scanString返回的是迭代器,转成列表后,每个元素对应一个完整的宏定义匹配结果,res[0]对应第一个宏#define MACRO1 42,res[1]对应第二个宏,以此类推,并非单个宏片段。
  • 每个匹配结果是一个三元组,结构为:(匹配内容集合, 匹配起始下标, 匹配结束下标)
    • 三元组的第一个元素(索引0)是匹配内容的集合,它既是按解析顺序存储片段的列表,也可通过setResultsName设置的名称访问对应值。比如res[0][0]['macro']能拿到'MACRO1',res[0][0]['value']拿到'42'。
    • 三元组的第二个元素(索引1)是该匹配在原字符串中的起始位置。
    • 三元组的第三个元素(索引2)是该匹配在原字符串中的结束位置。

如果要获取单个宏的片段,可以这样写:

first_match = res[0][0]
print(first_match['macro'])  # 输出 MACRO1
print(first_match['value'])  # 输出 42
# 也可通过列表索引访问
print(first_match[0])  # 输出 #define
print(first_match[1])  # 输出 MACRO1
print(first_match[2])  # 输出 42

内容的提问来源于stack exchange,提问作者pekoms

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 09:40:42