2014-02-22 30 views
3

一些背景:为什么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. 

感谢您的时间和帮助。

回答

2

ply lexmatch regular expression has different groups than a usual re的答案也有帮助。在lex.py中:

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

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

+0

我再次浏览了[documentation](http://www.dabeaz.com/ply/ply.html)。这个设置没有暗示在那里(至少我找不到一个)。 4.3或4.19将是正确的地方。但是这个设置很有意义。谢谢! – programkai

相关问题