编程语言
首页 > 编程语言> > python – ply lexmatch正则表达式具有与通常重复不同的组

python – ply lexmatch正则表达式具有与通常重复不同的组

作者:互联网

我正在使用ply并注意到存储在t.lex.lexmatch中的令牌重新匹配与使用re模块以通常方式定义的sre_pattern之间存在奇怪的差异.小组(x)似乎是1.

我已经定义了一个简单的词法分析器来说明我所看到的行为:

import ply.lex as lex

tokens = ('CHAR',)

def t_CHAR(t):
    r'.'
    t.value = t.lexer.lexmatch
    return t

l = lex.lex()

(我收到关于t_error的警告但暂时忽略它.)现在我将一些输入提供给词法分析器并获取一个令牌:

l.input('hello')
l.token()

我得到一个LexToken(CHAR,< _sre.SRE_Match对象,位于0x100fb1eb8>,1,0).我想看一下匹配对象:

m = _.value

所以现在我看看这些小组:

m.group()=> ‘h’正如我所料.

m.group(0)=> ‘h’正如我所料.

m.group(1)=> ‘h’,但我希望它没有这样一个团体.

将此与手动创建这样的正则表达式进行比较:

import re
p = re.compile(r'.')
m2 = p.match('hello')

这给了不同的群体:

m2.group()=’h’正如我所料.

m2.group(0)=’h’正如我所料.

m2.group(1)给出了IndexError:没有我期望的那样的组.

有谁知道为什么存在这种差异?

解决方法:

在PLY的3.4版本中,出现这种情况的原因与表达式如何从文档字符串转换为模式有关.

查看源代码确实有帮助 – lex.py的第746行:

c = re.compile("(?P<%s>%s)" % (fname,f.__doc__), re.VERBOSE | self.reflags)

我不建议在版本之间依赖类似的东西 – 这只是PLY工作原理的一部分.

标签:python,regex,lex,ply
来源: https://codeday.me/bug/20190521/1147578.html