2015-06-27 2 views
0

У меня есть текстовый файл, который я хочу разобрать. В файле есть несколько элементов, которые я хочу извлечь. Я хочу захватить все между двоеточием «:» и конкретным словом. Возьмем следующий пример.Разбор текста между несколькими строками - Python 2.7 и re Module

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

hahahaha, такое легкое решение. Я с ума сходил. Это сделало это, спасибо – 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

Смежные вопросы