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)是该匹配在原字符串中的结束位置。
- 三元组的第一个元素(索引0)是匹配内容的集合,它既是按解析顺序存储片段的列表,也可通过
如果要获取单个宏的片段,可以这样写:
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
相关产品推荐
相关产品推荐

