Python 正则表达式与re匹配,但与lex不匹配

Python 正则表达式与re匹配,但与lex不匹配,python,lex,re,Python,Lex,Re,我正试图解析一个文件以重新格式化它。为此,我需要能够区分整行注释和行末注释。我已经能够让lex正确识别完整的行注释,但是我对行末注释有问题 例如:“a=0;//这个;有效;很好”,但“a=0;//这个,有效;不有效” 最让我困惑的是re能够毫无疑问地识别这两个评论,而lex却不能 以下是相关代码(FL=整行,EL=行尾): tokens=( “相等”, “分号”, “FL_评论”, “EL_评论”, “字符串” ) t_等于r'=' t_分号=r';' def t_FL_注释(t): r“(^

我正试图解析一个文件以重新格式化它。为此,我需要能够区分整行注释和行末注释。我已经能够让lex正确识别完整的行注释,但是我对行末注释有问题

例如:“a=0;//这个;有效;很好”,但“a=0;//这个,有效;不有效”

最让我困惑的是re能够毫无疑问地识别这两个评论,而lex却不能

以下是相关代码(FL=整行,EL=行尾):

tokens=(
“相等”,
“分号”,
“FL_评论”,
“EL_评论”,
“字符串”
)
t_等于r'='
t_分号=r';'
def t_FL_注释(t):
r“(^ |\n)\s*(//|\).*”
返回t
def t_EL_注释(t):
r”“”(?Lex(包括帘布层品种)构建词法分析器,而不是正则表达式搜索器。与正则表达式库不同,正则表达式库通常尝试扫描整个输入以查找模式,lex尝试确定在当前输入点匹配的模式。然后,它将输入推进到紧跟其后的点,并尝试在该点查找匹配模式文本中的每个字符都包含在某个匹配的标记中(尽管某些标记可能会被丢弃)

实际上,您可以利用这一事实来简化正则表达式。例如,在这种情况下,由于您可以依靠
t\u FL\u COMMENT
来匹配出现在行首的注释,因此任何其他注释都必须不在行首。因此不需要查找:

def t_FL_COMMENT(t):
    r"""(^|\n)\s*(//|\#).*"""
    return t

def t_EL_COMMENT(t):
    r"""(//|\#).*"""
    return t

(\n | ^)
的另一种选择是
(?m)^
(它启用多行模式,以便
^
可以在换行符之后匹配,也可以在字符串的开头匹配).

请将问题中的代码编辑为a-任何人都可以复制/粘贴您的代码,无需添加任何内容即可运行代码以查看相同的问题。您需要包含导入和一些最低限度的数据。实际上,您应该已经提交了。请下次执行此操作;对于任何试图帮助您的人,甚至可能是赌徒,都会更轻松我知道规则看起来有点过于苛刻,甚至有些武断,但有一个很好的理由:它们节省时间,当你依靠志愿者提供答案时,他们的时间是宝贵的。问题是:请不要走错方向;这是一个简单的观察:你并不真正了解技术你正在使用或你正在遇到的问题。否则我们就不在这里了。所以你不应该假设你……实际上知道与问题相关的内容。如果你只包含所有内容,或者最好还是将所有内容简化为一个显示相同症状的简单示例,那么你不必担心。我们也不必依赖你的对你认为相关内容的描述必然不完美。简言之:永远不要描述你能展示的任何东西。(使用文本,而不是图像。在这种情况下,一张图片抵不上千言万语。)不要包含任何不经修改就不能运行的代码。因为有人会想这样做来帮助你。在这种情况下,我想我知道怎么回事,但我不能真正测试它,因为我没有你提供的完整程序。我不知道我看不到什么。我只能猜测,我可能会出去吃午饭。我的答案是如果它包含真实的、经过测试的代码会更好,如果我能够做到这一点,我会更高兴。我已经更新了帖子,以包含一个最小的示例。
def t_FL_COMMENT(t):
    r"""(^|\n)\s*(//|\#).*"""
    return t

def t_EL_COMMENT(t):
    r"""(//|\#).*"""
    return t