2009-11-24 38 views
2

我收到了一個我想從中提取有用數據的文件。該文件的格式是這樣的:匹配多個正則表達式組並將其刪除

LINE: 1 
TOKENKIND: somedata 
TOKENKIND: somedata 
LINE: 2 
TOKENKIND: somedata 
LINE: 3 

等等

我想這樣做的是去除LINE:和行號以及TOKENKIND:所以我只留下了一個由'somedata somedate somedata'組成的字符串...'

我正在使用Python來做到這一點,使用正則表達式(我不知道是否正確)匹配文件的位我想除去。

我的問題是,我如何讓Python匹配多個正則表達式組並忽略它們,向我的輸出字符串中添加任何與我的正則表達式不匹配的東西?我當前的代碼如下所示:

import re 
import sys 

ignoredTokens = re.compile(''' 
    (?P<WHITESPACE>  \s+   ) | 
    (?P<LINE>   LINE:\s[0-9]+ ) | 
    (?P<TOKEN>   [A-Z]+:  ) 
''', re.VERBOSE) 

tokenList = open(sys.argv[1], 'r').read() 
cleanedList = '' 

scanner = ignoredTokens.scanner(tokenList) 

for line in tokenList: 
    match = scanner.match() 

    if match.lastgroup not in ('WHITESPACE', 'LINE', 'TOKEN'): 
     cleanedList = cleanedList + match.group(match.lastindex) + ' ' 

print cleanedList 

回答

4
import re 

x = '''LINE: 1 
TOKENKIND: somedata 
TOKENKIND: somedata 
LINE: 2 
TOKENKIND: somedata 
LINE: 3''' 

junkre = re.compile(r'(\s*LINE:\s*\d*\s*)|(\s*TOKENKIND:)', re.DOTALL) 

print junkre.sub('', x) 
+0

完美。刪除我的for循環和使用sub()工作正常。謝謝你的幫助。 – greenie 2009-11-24 16:31:53

1

如何用一個空字符串替換""(^LINE: \d+$)|(^\w+:)

使用\n而不是^$也刪除不需要的空行。

+0

對不起,我不認爲我是足夠精確。我想知道的是,在我的for循環中,忽略WHITESPACE,LINE和TOKEN匹配的正確方法是什麼? – greenie 2009-11-24 16:24:38

+0

亞歷克斯發佈了這個即興和pythonified版本。 – Amarghosh 2009-11-24 16:47:06

2

不需要在Python中使用正則表達式。它的Python畢竟不是Perl。認爲簡單,並使用其字符串處理能力

f=open("file") 
for line in f: 
    if line.startswith("LINE:"): continue 
    if "TOKENKIND" in line: 
     print line.split(" ",1)[-1].strip() 
f.close() 
相關問題