mur*_*own 6 python regex lex ply
我正在使用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()
Run Code Online (Sandbox Code Playgroud)
(我收到关于t_error的警告但暂时忽略它.)现在我将一些输入提供给词法分析器并获取一个令牌:
l.input('hello')
l.token()
Run Code Online (Sandbox Code Playgroud)
我得到了LexToken(CHAR,<_sre.SRE_Match object at 0x100fb1eb8>,1,0).我想看一下匹配对象:
m = _.value
Run Code Online (Sandbox Code Playgroud)
所以现在我看看这些小组:
m.group()=> 'h'正如我所料.
m.group(0)=> 'h'正如我所料.
m.group(1)=> 'h',但我希望它没有这样一个群体.
将此与手动创建这样的正则表达式进行比较:
import re
p = re.compile(r'.')
m2 = p.match('hello')
Run Code Online (Sandbox Code Playgroud)
这给了不同的群体:
m2.group()= 'h'正如我所料.
m2.group(0)= 'h'正如我所料.
m2.group(1)IndexError: no such group按照我的预期给出.
有谁知道为什么存在这种差异?
在PLY版本3.4中,发生这种情况的原因与如何将表达式从文档字符串转换为模式有关。
查看源代码确实有帮助-lex.py的第746行:
c = re.compile("(?P<%s>%s)" % (fname,f.__doc__), re.VERBOSE | self.reflags)
Run Code Online (Sandbox Code Playgroud)
我不建议在版本之间依赖这样的东西-这只是PLY工作原理的一部分。
| 归档时间: |
|
| 查看次数: |
727 次 |
| 最近记录: |