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

使用PLY进行句子验证时正则表达式匹配报错问题排查

问题原因分析

PLY的词法分析器遵循两个核心匹配规则:

  • 优先匹配最长的字符串
  • 若多个规则均能匹配最长字符串,先定义的规则优先级更高

你的场景中,nouns的正则r'[A-Za-z]+'可以匹配所有字母组成的单词,包括is、are这类动词。当verbs规则定义在nouns规则之后时:

  • 输入This are时,第二个单词are同时符合nouns和verbs的匹配规则,且匹配长度一致
  • PLY会优先选择先定义的nouns规则,将are识别为名词
  • 最终语法分析时,句子结构为nouns + nouns,不符合Sentence -> nouns verbs的规则,因此触发错误

而当你把verbs正则改为is|are|am时能正常运行,大概率是无意中调整了规则定义顺序——将verbs规则放在了nouns规则前面,此时are会被优先识别为动词,语法校验自然通过。

解决方法

方法1:调整规则定义顺序

将verbs的词法规则放在nouns规则之前,确保动词类单词被优先识别:

import ply.lex as lex

tokens = ('NOUNS', 'VERBS')

# 先定义verbs规则
def t_VERBS(t):
    r'is|are|am'
    return t

# 再定义nouns规则
def t_NOUNS(t):
    r'[A-Za-z]+'
    return t

# 忽略空格
t_ignore = ' '

# 错误处理
def t_error(t):
    print(f"Illegal character '{t.value[0]}'")
    t.lexer.skip(1)

lexer = lex.lex()

方法2:优化nouns正则表达式

如果不想调整规则顺序,可以用正则负向前瞻排除动词,避免nouns规则误匹配动词:

def t_NOUNS(t):
    r'(?!is|are|am)[A-Za-z]+'
    return t

内容的提问来源于stack exchange,提问作者David Price

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 04:36:04