2015-06-27 68 views
0

我有一個文本文件,我想解析。該文件有多個要提取的項目。我想捕獲冒號「:」和特定單詞之間的所有內容。我們來看下面的例子。解析多行之間的文本 - Python 2.7和重新模塊

Description : a pair of shorts 
amount : 13 dollars 
requirements : must be blue 
ID1 : 199658 
---- 

以下代碼解析信息。

import re 

f = open ("parse.txt", "rb") 
fileRead = f.read() 

Description = re.findall("Description :(.*?)amount", fileRead, re.DOTALL) 
amount = re.findall("amount :(.*?)requirements", fileRead, re.DOTALL) 
requirements = re.findall("requirements :(.*?)ID1", fileRead, re.DOTALL) 
ID1 = re.findall("ID1 :(.*?)-", fileRead, re.DOTALL) 

print Description[0] 
print amount[0] 
print requirements[0] 
print ID1[0] 

f.close() 

的問題是,有時文本文件將有一個新的生產線,如該

Description 
: a pair of shorts 
amount 
: 13 dollars 
requirements: must be blue 
ID1: 199658 
---- 

在這種情況下,我的代碼將無法正常工作,因爲它無法找到「描述:」因爲它現在分成一個新行。如果我選擇將搜索更改爲「:(。*?)要求」,它將不會返回13美元,它將返回一對短褲和13美元,因爲所有文本都位於第一個冒號和單詞之間, 要求。無論是否存在換行符,我都希望有一種解析信息的方式。我遇到了路障,您的幫助將不勝感激。

+1

你爲什麼不讓它'r'Description \ S + ...'',允許多個空白字符(包括新行)? – jonrsharpe

+0

haha​​haha,這樣一個簡單的修復。我一直在爲此瘋狂。那是做的,謝謝 – benipy

回答

0

您可以使用這樣的正則表達式:

Description[^:]*(.*) 
    ^--- use the keyword you want 

Working demo

引用您的代碼,你可以使用:

import re 

f = open ("parse.txt", "rb") 
fileRead = f.read() 

Description = re.findall("Description[^:]*(.*)", fileRead) 
amount = re.findall("amount[^:]*(.*)", fileRead) 
requirements = re.findall("requirements[^:]*(.*)", fileRead) 
ID1 = re.findall("ID1[^:]*(.*)", fileRead) 

print Description[0] 
print amount[0] 
print requirements[0] 
print ID1[0] 

f.close() 
0

你可以簡單地這樣做:

import re 
f = open ("new.txt", "rb") 
fileRead = f.read() 
keyvals = {k.strip():v.strip() for k,v in dict(re.findall('([^:]*):(.*)(?=\b[^:]*:|$)',fileRead,re.M)).iteritems()} 
print(keyvals) 
f.close() 

輸出:

{'amount': '13 dollars', 'requirements': 'must be blue', 'Description': 'a pair of shorts', 'ID1': '199658'} 
+0

謝謝@Pruthvi Raj – benipy