如何用PyParsing的parseString()提取两个标记间的字符串?
使用PyParsing的parseString()提取标记间内容的方法
你遇到的问题很典型:parseString()和searchString()的核心区别在于,parseString()要求从字符串的开头到结尾完全匹配你的规则,而searchString()会在整个字符串中查找符合规则的片段。你的原始规则只定义了AAA和ZZZ包裹的部分,自然无法匹配开头的qwerty或gfgfd,所以会抛出解析异常。
要让parseString()也能得到相同结果,只需要调整规则,把前后的无关内容也纳入匹配范围,同时保留我们需要的中间部分。这里有两种简洁的实现方式:
方法1:跳过前后无关内容并提取目标
import pyparsing as pp s = 'qwertyAAA1234ZZZazerty' # 规则:跳过开头到AAA,匹配目标片段,再跳过剩余内容 rule = pp.SkipTo("AAA") + pp.nestedExpr("AAA", "ZZZ") + pp.SkipTo(pp.StringEnd()) result = rule.parseString(s) # 提取索引1的元素,就是我们要的中间内容 print(result[1]) # 输出: [['1234']]
方法2:用Suppress忽略无关内容(更简洁)
如果不想保留前后的无关内容,可以用Suppress()直接忽略它们,这样解析结果里就只有我们需要的部分:
import pyparsing as pp s = 'qwertyAAA1234ZZZazerty' # 规则:忽略开头到AAA的内容,匹配目标片段,忽略后续内容 rule = pp.Suppress(pp.SkipTo("AAA")) + pp.nestedExpr("AAA", "ZZZ") + pp.Suppress(pp.SkipTo(pp.StringEnd())) result = rule.parseString(s) print(result) # 输出: [['1234']]
这两种方式都能让parseString()成功解析整个字符串,同时得到和searchString()一致的提取结果。
内容的提问来源于stack exchange,提问作者Raphael
相关产品推荐
相关产品推荐

