2010-05-16 4 views
0

В принципе, у меня есть файл, как это:Извлечение данных из текстового файла для использования в скрипте python?

Url/Host: www.example.com 
Login:  user 
Password: password 
Data_I_Dont_Need: something_else 

Как я могу использовать регулярные выражения, чтобы отделить детали, чтобы поместить их в переменные?

Извините, если это ужасный вопрос, я просто не могу понять RegEx. Итак, еще один вопрос: можете ли вы предоставить RegEx, но объясните, для чего они предназначены?

+2

Использование str.split (":") не является опцией? – extraneon

ответ

1

Вы должны поместить записи в словарь, а не так много отдельных переменных - очевидно, ключи, которые вы используете n eed NOT быть допустимым в качестве имен переменных (это сокращение в «Url/Host» было бы убийцей!), но они будут просто прекрасны в качестве строковых ключей в словаре.

import re 

there = re.compile(r'''(?x)  # verbose flag: allows comments & whitespace 
        ^  # anchor to the start 
         ([^:]+) # group with 1+ non-colons, the key 
         :\s*  # colon, then arbitrary whitespace 
         (.*)  # group everything that follows 
         $   # anchor to the end 
        ''') 

, а затем

configdict = {} 
for aline in open('thefile.txt'): 
    mo = there.match(aline) 
    if not mo: 
    print("Skipping invalid line %r" % aline) 
    continue 
    k, v = mo.groups() 
    configdict[k] = v 

возможность создания моделей RE «многословный» (начиная их с (?x) или использованием re.VERBOSE в качестве второго аргумента re.compile) очень полезно, чтобы позволить вам уточнить ваш REs с комментариями и красиво выравнивающими пробелами. Я думаю, что это печально недоиспользуется ;-).

+0

Хороший ответ и отличное объяснение. Я думаю, что я хотел бы, чтобы потенциальные пробелы были удалены. Я считаю, что это можно сделать, добавив \ s * между группой значений и привязкой конца строки '$'? – extraneon

+0

AttributeError: объект 'NoneType' не имеет атрибута 'group' – Rob

+0

@Rob, вы имеете в виду 'groups', а не' group'. Да, я забыл добавить 'continue', очевидно, чтобы ** сделать ** пропустить, позвольте мне добавить его.Кстати, в вашем вопросе не упоминается, что могут быть линии, которые не соответствуют этому шаблону, и что делать, когда такие строки найдены - пожалуйста, отредактируйте свой Q, чтобы добавить эту важную информацию! –

0

Ну, если вы не знаете о регулярных выражений, просто изменить вам файл, как это:

Host = www.example.com 
Login = uer 
Password = password 

И использовать модуль питона ConfigParser http://docs.python.org/library/configparser.html

+0

Изменение файла на самом деле не вариант, но спасибо – Rob

+0

ConfigParser поддерживает ':' разделитель http://stackoverflow.com/questions/2845018/extracting-data-from-a-text-file-to-use-in -a-python-script/2845923 # 2845923 – jfs

0

EDIT: Лучшее решение

for line in input: 
    key, val = re.search('(.*?):\s*(.*)', line).groups() 
1

Для такого простого файла вам не нужны регулярные выражения. Строковые функции, вероятно, легче понять. Этот код:

def parse(data): 
    parsed = {}  
    for line in data.split('\n'): 
     if not line: continue # Blank line 
     pair = line.split(':') 
     parsed[pair[0].strip()] = pair[1].strip() 
    return parsed 

if __name__ == '__main__': 
    test = """Url/Host: www.example.com 
    Login:  user 
    Password: password 
""" 
    print parse(test) 

будет делать эту работу, и результаты в:

{'Login': 'user', 'Password': 'password', 'Url/Host': 'www.example.com'} 
0

ConfigParser модуль поддерживает ':' разделитель.

import ConfigParser 
from cStringIO import StringIO 

class Parser(ConfigParser.RawConfigParser): 
    def _read(self, fp, fpname): 
     data = StringIO("[data]\n"+fp.read()) 
     return ConfigParser.RawConfigParser._read(self, data, fpname) 

p = Parser() 
p.read("file.txt") 
print dict(p.items("data")) 

Выход:

{'login': 'user', 'password': 'password', 'url/host': 'www.example.com'} 

Хотя регулярное выражение или ручного разбора может быть более подходящим в вашем случае.

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