2015-06-27 67 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