一些背景:
我正在编写一个解析器来使用标记语言从站点检索信息。作为 wikitools 的标准库,......对我不起作用,因为我需要更具体,并且根据我的需要调整它们会在我和问题之间增加一层复杂性。Python +“简单”正则表达式让我难以以透明的方式识别标记语言中不同“令牌”之间的依赖关系 - 所以显然我需要在这个旅程结束时到达 PLY。
现在看来,与 Python 相比,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 的行为不同呢?(以及如何?-在文档中或在stackoverflow中找不到东西)。
我想这更多的是我对 PLY 的理解,因为该工具已经存在了很长一段时间,即我猜这种行为是有意的。我能找到的唯一相关信息涉及不同的群体,但没有解释识别正则表达式本身的不同行为。我在 ply-hack 中也一无所获。
我是否忽略了一些愚蠢的简单事情?
出于比较目的,标准 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.
感谢您的时间和帮助。