2011-04-05 54 views
1

人, 我對使用Python工作重新解析包含這樣行一個配置文件: [VAR:ABC123] ... ...幫助與特定的Python應用程序重新

.CSIIND~~~LOCAL~~~I4~~~0~~~ 

[VAR: def234] 
... 
<bunch of stuff> 
... 

.CSIIND ~~~ LOCAL ~~~ I4 ~~~ 1 ~~~

...

我試圖建立以提取這樣的事情:

VARNAME/CSIIND

ABC123/0

def234/1

......

我沒有很多的正則表達式的背景,所以我可能有點慢,但我一直在尋找我能找到的每一個教程和資源,但無濟於事。

請幫助我,至少有方向性的建議!我不是要求完成代碼!

我已經得到了最遠的是這樣的正則表達式:

R 「^ [VAR:?+]。?+ CSIIND」,

其中至少比賽很多次,因爲我希望它,但我無法得到它匹配的號碼

+0

請解決您的格式。還請添加更多輸入示例和您想要的輸出示例 – Daenyth 2011-04-05 16:35:21

+0

請正確格式化您的代碼! – 2011-04-05 16:36:13

+0

我以爲我通過縮進4個空格作爲「提問問題」表單的指示。 – Doug 2011-04-05 18:09:51

回答

0

需要更多的細節。變量「var」是用方括號括起來的東西嗎?用「:」之前的名稱和值之後的所有值? [foo:「Bar先生的Foo店」]

如果是這樣,你可能只需要在「:」上分割就可以了,而不是用複雜的正則表達式來打擾。

好看看這個:

import re 
stuff0='[stuff:junk]' 
stuff1=stuff0[1:-1]   # Knock off the brackets 
stuff2=re.split(':', stuff) # Split the name from value 
stuff3=stuff2[0]+'/'+stuff2[1] # Recombine into your requested format 
print stuff3 
'stuff/junk' 

我拆分出來成爲許多線清晰。您可以將幾個步驟拉入一行。

+0

謝謝,跳過,但是我真正想要提取的更像是:junk/1,junk2/2 junk3/0 – Doug 2011-04-05 22:31:42

+0

道格對我所給予的是一個很小的改變。你需要一個你描述的格式的字符串嗎?在循環遍歷文件{stuffstring =''}之前初始化字符串,然後將每行項目追加到它{stuffstring + = stuff3}。或者你可以用它來創建一個字典{字典[stuff2 [0]] = stuff2 [2]或者任何你需要的東西。你最終想用數據做什麼? – 2011-04-06 11:11:11

+0

跳過:真的,感謝您的努力和幫助。我打算將這些數據提供給電子表格,因此最終很可能會在CSV輸出中輸入。我一直在想,基於字典的方法可能是更好的方法。我很欣賞所有人的幫助,儘管它並沒有真正回答所問的問題。這更多的是我整個方法的返工。因此,即使我現在走向另一個方向,我仍然希望有一天能夠計算出正則表達式。 – Doug 2011-04-06 23:40:30

0

這也許是比你問:

ch = '''[VAR: abc123] 
hhhgfgfjhfghjf 
... ... 
.CSIIND~~~LOCAL~~~I4~~~0~~~ 
[VAR: def234] 
... 
<bunch of stuff> 
... 
...... 
.CSIIND~~~LOCAL~~~I4~~~1~~~ 
llhgjgj 
[VAR: ab1587] 
hhhgfgfjhfghjf 
... ... 
.Cosoo~~~LOCAL~~~I4~~~120~~~ 
zhbyi,i,uy_o 
[VAR: abc123] 
hhhgfgfjhfghjf 
... ... 
.CUSUT~~~LOCAL~~~I4~~~28~~~ 
[VAR: def234] 
... 
<bunch of stuff> 
... 
...... 
.CUSUT~~~LOCAL~~~I4~~~45~~~''' 

import re 
from itertools import groupby 
from operator import itemgetter 

RE = ('\[([^:]+):\s+([^\]]+)\]\s*[\r\n]+' 
     '(?:.+[\r\n]+)*?' 
     '\.([^~\r\n]+?)~~~[^~]+~~~[^~]+~~~(\d+)~~~') 

pat = re.compile(RE,re.MULTILINE) 

li = [ (k,[tuple(x)[1::2] for x in g]) for k,g in groupby(pat.findall(ch),key=itemgetter(2))] 
for y in li: 
     print y 

結果

('CSIIND', [('abc123', '0'), ('def234', '1')]) 
('Cosoo', [('ab1587', '120')]) 
('CUSUT', [('abc123', '28'), ('def234', '45')]) 

,可以扣除任何演示你想

+0

它是;你是對的:完成我不明白的代碼。 – Doug 2011-04-05 23:42:03

+0

@Doug分析的配置文件中是否只有一個varname,例如** CSIIND **在你的例子中?如果是這樣,我的代碼做得太多了,我可以簡化我的代碼。如果沒有(也就是說在一個文件中有多個varnames,例如** CSIIND **,** Cosoo **,** CUSUT **在我的例子中)是否要我解釋我的代碼? – eyquem 2011-04-06 00:09:29

+0

每個參數都有幾十個參數。 – Doug 2011-04-06 23:52:38