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

使用pyparsing提取关键词的前缀与后缀

解决pyparsing拆分前缀、关键词和后缀的问题

我来帮你搞定这个字符串拆分的问题!你的代码没生效主要有两个关键问题,咱们一步步拆解:

问题出在哪?

  • 贪婪匹配坑了你:ZeroOrMore(Word(alphas))是贪婪模式,会把关键词里的单词也当成前缀的一部分吃掉,导致后面的关键词完全匹配不到。比如输入"aa bb first item ee ff",它会把"aa"、"bb"、"first"、"item"全当成前缀,剩下的"ee ff"没法匹配关键词,直接报错。
  • oneOf用法错误:oneOf(['first item', 'second item'])不能识别带空格的多词短语,因为oneOf默认是处理单个token的选项,它会把"first item"拆成"first"和"item"两个独立的候选,根本不会匹配整个短语。

修正后的解决方案

咱们换个思路,用SkipTo来精准匹配前后缀,同时把多词关键词定义成整体的Literal:

from pyparsing import Literal, SkipTo, LineEnd, Optional

# 定义预定义的多词关键词,每个关键词作为整体Literal
keyword_expr = Literal("first item") | Literal("second item")

# 前缀:匹配到关键词之前的所有内容,自动处理空格
prefix = SkipTo(keyword_expr).setResultsName("prefix")

# 后缀:匹配关键词之后到行尾的所有内容
suffix = SkipTo(LineEnd()).setResultsName("suffix")

# 组合完整解析规则,处理前后缀可能为空的情况
parser = Optional(prefix) + keyword_expr.setResultsName("word") + Optional(suffix)

# 测试示例
test_cases = [
    "aa bb first item ee ff",
    "first item ee ff",
    "aa bb second item",
    "second item"
]

for case in test_cases:
    result = parser.parseString(case)
    print(f"输入: {case}")
    print(f"前缀: '{result.prefix.strip() if 'prefix' in result else ''}'")
    print(f"关键词: '{result.word}'")
    print(f"后缀: '{result.suffix.strip() if 'suffix' in result else ''}'")
    print("---")

代码说明

  • SkipTo(keyword_expr):精准停在关键词之前,不会贪婪吃掉关键词的内容,完美解决前缀匹配的问题。
  • Literal("first item"):把多词短语作为一个整体匹配,确保关键词被正确识别。
  • Optional():处理前缀或后缀为空的情况,让解析规则更灵活。

运行这段代码,你会看到所有测试用例都能正确拆分出前缀、关键词和后缀啦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:12:58