2010-03-03 42 views
1

如何在python中構建一個正則表達式,它可以匹配以下所有內容?我如何建立一個正則表達式,其中有選項部分

舉例::
someotherstring 42 1 48 17,
somestring 363 1 46 17,363 1 34 17,401 3 8 14,
otherstring 42 1 48 17,363 1 34 17,

其中它是一個 「字符串(A-ZA-Z)」 被1點或多個4的整數,其通過逗號分隔遵循由空間後續

我曾嘗試以下,因爲我需要知道每個整數:

myRE=re.compile("(\s+) ((\d+) (\d+) (\d+) (\d+),)+" 

但我怎麼能查出我有多少的4個整數呢?以及我如何處理它們中的每一個?

謝謝。

+0

這就要困難得多,因爲逗號既用作整數的分隔符和「數據單位」。如果您可以輕鬆影響數據的外觀,那麼我會嘗試在每個字符串之前使用分號。使用'split'應該足夠了,而不是re。 – 2010-03-03 08:45:32

回答

1
>>> test = "somestring 363 1 46 17,363 1 34 17,401 3 8 14," 

這裏是你的輸入字符串pyparsing處理器:

>>> from pyparsing import * 
>>> integer = Word(nums) 
>>> patt = Word(alphas) + OneOrMore(Group(integer*4 + Suppress(','))) 

使用patt.parseString返回pyparsing ParseResults對象,其中有一些很好的列表/字典/對象屬性。首先,將結果打印成列表:

>>> patt.parseString(test).asList() 
['somestring', ['363', '1', '46', '17'], ['363', '1', '34', '17'], ['401', '3', '8', '14']] 

查看您的每個組是如何分組的子列表?

現在讓我們讓解析器爲我們做更多的工作。在解析時,我們已經知道我們正在解析有效整數 - 任何匹配Word(nums)的東西都必須是整數。因此,我們可以添加一個解析動作做在分析時這種轉換:

>>> integer = Word(nums).setParseAction(lambda tokens:int(tokens[0])) 

現在,我們重新調整我們的模式,現在解析爲我們提供了一組數字:

>>> patt = Word(alphas) + OneOrMore(Group(integer*4 + Suppress(','))) 
>>> patt.parseString(test).asList() 
['somestring', [363, 1, 46, 17], [363, 1, 34, 17], [401, 3, 8, 14]] 

最後,我們還可以指定名稱解析出該輸入的比特:

>>> patt = Word(alphas)("desc") + OneOrMore(Group(integer*4 + Suppress(',')))("numgroups") 

返回的項目列表是相同的:

>>> patt.parseString(test).asList() 
['somestring', [363, 1, 46, 17], [363, 1, 34, 17], [401, 3, 8, 14]] 

但是如果我們轉儲()的結果,我們看看我們可以按名稱訪問:

>>> print patt.parseString(test).dump() 
['somestring', [363, 1, 46, 17], [363, 1, 34, 17], [401, 3, 8, 14]] 
- desc: somestring 
- numgroups: [[363, 1, 46, 17], [363, 1, 34, 17], [401, 3, 8, 14]] 

我們可以使用類似字典的或屬性,如訪問那些名字。我偏愛的屬性風格自己:

>>> res = patt.parseString(test) 
>>> print res.desc 
somestring 
>>> print res.numgroups 
[[363, 1, 46, 17], [363, 1, 34, 17], [401, 3, 8, 14]] 
>>> for ng in res.numgroups: print sum(ng) 
... 
427 
415 
426 

這裏是整個解析器和輸出處理器:

test = "somestring 363 1 46 17,363 1 34 17,401 3 8 14," 
from pyparsing import * 
integer = Word(nums).setParseAction(lambda tokens:int(tokens[0])) 
patt = Word(alphas)("desc") + \ 
    OneOrMore(Group(integer*4 + Suppress(',')))("numgroups") 

print patt.parseString(test).asList() 
print patt.parseString(test).dump() 
res = patt.parseString(test) 
print res.desc 
print res.numgroups 
for ng in res.numgroups: 
    print sum(ng) 
0

隨着數據單元(如我打電話給他們上圖)是由一個逗號和空格分開,你仍然可以使用split :)

data = "someotherstring 42 1 48 17, somestring 363 1 46 17,363 1 34 17,401 3 8 14, otherstring 42 1 48 17,363 1 34 17" 

data_items = data.split(', ') 
for item in data_items: 
    section_title, intdata = item.split(' ', 1) 
    print 'Processing %s' % section_title 
    for ints in intdata.split(','): 
     a, b, c, d = [int(x) for x in ints.split()] 
     # do your stuff ... 
0
import re 
str_in = "someotherstring 42 1 48 17, somestring 363 1 46 17,363 1 34 17,401 3 8 14, otherstring 42 1 48 17,363 1 34 17," 
list_out = re.split("[\\s,]", str_in) 

list_out則包含一個列表,其中的名每個部分之後是所有整數(如仍字符串),然後空條目(用於界定部分是有用的),等等:

['someotherstring', '42', '1', '48', '17', '', 'somestring', '363', '1', '46', '17', '363', '1', '34', '17', '401', '3', '8', '14', '', 'otherstring', '42', '1', '48', '17', '363', '1', '34', '17', ''] 
相關問題