2012-06-20 69 views
2

你如何在pyparsing中使用下面的正則表達式?它應該返回給定正則表達式的令牌列表。python中的python正則表達式

任何幫助將不勝感激!謝謝!

蟒蛇正則表達式的例子在shell:

>>> re.split("(\w+)(lab)(\d+)", "abclab1", 3) 
>>> ['', 'abc', 'lab', '1', ''] 

我想這在pyparsing,但我似乎無法弄清楚如何得到它的權利,因爲第一場比賽是貪婪,即第一個令牌將是'abclab'而不是兩個令牌'abc''lab'

pyparsing例如(高層次,即非工作代碼):

name = 'abclab1' 
location = Word(alphas).setResultsName('location') 
lab = CaselessLiteral('lab').setResultsName('environment') 
identifier = Word(nums).setResultsName('identifier') 
expr = location + lab + identifier 
match, start, end = expr.scanString(name).next() 
print match.asDict() 

回答

0

如果剝去分組符號(括號),你會得到正確的答案:)

>>> re.split("\w+lab\d+", "abclab1") 
['', ''] 
+0

感謝您的答案,但我想要做的是使用pyparsing來做幾乎做正則表達式。所以使用pyparsing,它應該返回一個字典,如... {location:abc,enviornment:lab,identifier:1} – user1468650

4

Pyparsing的類幾乎是從左到右的,使用像FollowedBy(用於正向lookahead)和NotAny或'〜'操作符(用於負向預測)的顯式表達式來實現lookahead。這允許您檢測通常與正在重複的項目匹配的終結器。例如,OneOrMore(Word(alphas)) + Literal('end')永遠不會在「start blah blah end」這樣的字符串中找到匹配項,因爲在OneOrMore中的重複表達式中終止的'end'將被吞噬。解決方法是在重複的表達式中添加負向預測:OneOrMore(~Literal('end') + Word(alphas)) + Literal('end') - 也就是說,在閱讀另一個由alpha構成的單詞之前,首先確保它不是單詞'end'。

當重複處於pyparsing類(如Word)內時,這會中斷。只要沒有空格來停止單詞,Word(alphas)將繼續閱讀字母字符。你將不得不使用一些非常昂貴的東西來重複這個重複,比如Combine(OneOrMore(~Literal('lab') + Word(alphas, exact=1))) - 我說這很昂貴,因爲使用複雜的Combine表達式構成簡單的令牌會導致緩慢的解析器。

您可能能夠通過使用包裹在一個pyparsing正則表達式對象正則表達式妥協:

>>> labword = Regex(r'(\w+)(lab)(\d+)') 
>>> print labword.parseString("abclab1").dump() 
['abclab1'] 

這並不正確類型的分組和檢測,但不公開組本身。要做到這一點,名稱分別添加到組 - pyparsing會把這些類似的結果的名字,並給你訪問到各個領域,就像您曾呼籲setResultsName:

>>> labword = Regex(r'(?P<locn>\w+)(?P<env>lab)(?P<identifier>\d+)') 
>>> print labword.parseString("abclab1").dump() 
['abclab1'] 
- env: lab 
- identifier: 1 
- locn: abc 
>>> print labword.parseString("abclab1").asDict() 
{'identifier': '1', 'locn': 'abc', 'env': 'lab'} 

唯一的其他非正則表達式的方法,我可以想到會定義一個表達式來讀取整個字符串,然後在分析操作中分解這些部分。