使用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
相关产品推荐
相关产品推荐

