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

使用pyparsing set_parse_action()去除字符串空白遇错误及文本丢失问题

问题分析与解决方案

错误原因

  1. 原代码报错:pp.token_map(str.strip) 作用于 Group 返回的 ParseResults 对象,但 str.strip 仅能处理字符串,无法直接作用于 ParseResults,因此触发类型错误。
  2. 自定义函数丢失文本:你使用了 token.str.strip(),但 tokens 中的元素是 SkipTo 返回的 ParseResults 对象,并没有 str 属性,导致实际未提取到文本内容。

解决方案

方案一:保留每行结构,单独去除每行空白

import pyparsing as pp

def _strip_whitespace(tokens):
    # tokens[0] 是 OneOrMore 匹配到的所有行,每行是 SkipTo 返回的 ParseResults
    return [line[0].strip() for line in tokens[0]]

text_block = pp.Group(
    pp.OneOrMore(
        pp.SkipTo(pp.LineEnd()) + pp.LineEnd().suppress(),
        stopOn=pp.StringEnd() | (pp.LineStart() + (pp.Literal("E)") | pp.Literal("F)")))
    )
).set_parse_action(_strip_whitespace)

方案二:在匹配每行时直接处理空白(更高效)

import pyparsing as pp

# 对每行单独执行strip,再抑制换行符
line = pp.SkipTo(pp.LineEnd()).set_parse_action(lambda t: t[0].strip()) + pp.LineEnd().suppress()

text_block = pp.Group(
    pp.OneOrMore(
        line,
        stopOn=pp.StringEnd() | (pp.LineStart() + (pp.Literal("E)") | pp.Literal("F)")))
    )
)

方案三:将整个文本块合并为单个strip后的字符串

如果不需要保留每行结构,而是要整块文本的去空白结果:

import pyparsing as pp

def _strip_block(tokens):
    # 拼接所有行,再整体去除首尾空白
    full_text = '\n'.join(str(line[0]) for line in tokens[0])
    return full_text.strip()

text_block = pp.Group(
    pp.OneOrMore(
        pp.SkipTo(pp.LineEnd()) + pp.LineEnd().suppress(),
        stopOn=pp.StringEnd() | (pp.LineStart() + (pp.Literal("E)") | pp.Literal("F)")))
    )
).set_parse_action(_strip_block)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 18:40:16