5

一些背景:

我正在编写一个解析器来使用标记语言从站点检索信息。作为 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.

感谢您的时间和帮助。

4

1 回答 1

4

ply lexmatch 正则表达式中的答案与通常的 re 有不同的组在这里也有帮助。在 lex.py 中:

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

注意VERBOSE国旗。这意味着re引擎会忽略正则表达式中的空白字符。所以r'-- .* --'真的意味着r'--.*--',它确实完全匹配一个像'--- foobar ---'. re.VERBOSE有关详细信息,请参阅文档。

于 2014-02-22T22:19:09.400 回答