Pyparsing语法解析失败咨询:为何无法正确解析指定字符串?
问题原因
原代码里的token_any = pp.Word(pp.printables)会把结尾的*也匹配进去,因为pp.printables包含了*字符。当解析*asd*时:
- 第一个
Literal("*")匹配开头的* token_any会贪婪匹配所有后续的可打印字符,也就是asd*- 此时字符串已被匹配完,后面的
Literal("*")找不到匹配项,因此报错
Pyparsing的Word是匹配连续的符合字符集的字符,不会自动回溯去预留结尾的*,这和正则\*.*\*的行为不同——正则引擎会在匹配到末尾后回溯找到最后一个*,但Word一旦匹配就不会拆分已匹配的内容。
修复方案
有两种常见的修复方式:
方式一:修改字符集,排除*
把token_any的字符集改成不包含*的可打印字符:
import pyparsing as pp token_any = pp.Word(pp.printables.replace('*', '')) comment = pp.Literal("*") + token_any("comment text") + "*" res = comment.parse_string("""*asd*""") print(res.dump())
方式二:使用正则表达式匹配
直接用pp.Regex实现精准匹配,或者替换原token_any:
import pyparsing as pp # 替换token_any的写法 token_any = pp.Regex(r'[^*]+') comment = pp.Literal("*") + token_any("comment text") + "*" res = comment.parse_string("""*asd*""") print(res.dump())
运行修复后的代码,就能正确解析出comment text: 'asd'。
内容的提问来源于stack exchange,提问作者The Bic Pen
相关产品推荐
相关产品推荐

