一些背景:为什么PLY将正则表达式与Python/re不同?
我正在编写一个解析器来从具有标记语言的站点检索信息。作为wikitools的标准库,...并不适合我,因为我需要更加具体,并根据自己的需求调整它们,从而在我和问题之间形成一层复杂的关系。 Python +“简单”的正则表达式让我陷入了困境,以透明的方式识别标记语言中不同“标记”之间的依赖关系 - 显然,我需要在这次旅程结束时到达PLY。
现在看来,PLY通过正则表达式来识别令牌的方式与Python相比有所不同 - 但我无法找到它。我不想继续前进,以防万一我不明白PLY如何确定词法分析器中的令牌(否则我将无法控制我所依赖的逻辑,并在以后阶段失败)。
这里,我们去:
import ply.lex as lex
text = r'--- 123456 ---'
token1 = r'-- .* --'
tokens = (
'TEST',
)
t_TEST = token1
lexer = lex.lex(reflags=re.UNICODE, debug=1)
lexer.input(text)
for tok in lexer:
print tok.type, tok.value, tok.lineno, tok.lexpos
结果:
lex: tokens = ('TEST',)
lex: literals = ''
lex: states = {'INITIAL': 'inclusive'}
lex: Adding rule t_TEST -> '-- .* --' (state 'INITIAL')
lex: ==== MASTER REGEXS FOLLOW ====
lex: state 'INITIAL' : regex[0] = '(?P<t_TEST>-- .* --)'
TEST --- 123456 --- 1 0
最后一行是令人吃惊的 - 我本来期望的第一个和最后-
在--- 123456 ---
丢失的情况下,可与“搜索”相媲美(并且在与“匹配”相当的情况下并不存在)。显然这是重要的,因为--
无法与---
(或===
从===
)区分开来,即标题,编号等...无法区分。
那么为什么PLY对于标准的Python/regex表现不同呢? (以及如何? - 在文档中找不到东西,或在这里在计算器)。
我猜想这是我对PLY的更多理解,因为这个工具已经存在很长一段时间了,也就是说,这种行为在我猜测的意图中存在。我能找到的唯一与之相关的信息与different groups相关,但不能解释识别正则表达式本身的不同行为。我也没有发现任何东西。
我可以忽略一些愚蠢的简单吗?
对于这里比较目的标准Python /正则表达式:
import re
text = r'--- 123456 ---'
token1 = r'-- .* --'
p = re.compile(token1)
m = p.search(text)
if m:
print 'Match found: ', m.group()
else:
print 'No match'
m = p.match(text)
if m:
print 'Match found: ', m.group()
else:
print 'No match'
给出:
Match found: -- 123456 --
No match
(正如所料,第一个是 “搜索” 的结果的 “匹配”,第二)
我的设置:我正在使用spyder - 这是开始时的终端显示屏:
Python 2.7.5+ (default, Sep 19 2013, 13:49:51)
[GCC 4.8.1] on linux2
Type "help", "copyright", "credits" or "license" for more information.
Imported NumPy 1.7.1, SciPy 0.12.0, Matplotlib 1.2.1
Type "scientific" for more details.
感谢您的时间和帮助。
我再次浏览了[documentation](http://www.dabeaz.com/ply/ply.html)。这个设置没有暗示在那里(至少我找不到一个)。 4.3或4.19将是正确的地方。但是这个设置很有意义。谢谢! – programkai