2014-02-22 35 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

相關問題