2010-05-16 5 views
0

Fondamentalement, je dispose d'un fichier comme ceci:Extraction de données à partir d'un fichier texte à utiliser dans un script python?

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

Comment puis-je utiliser RegEx pour séparer les détails de les placer dans des variables? Désolé si c'est une question terrible, je ne peux tout simplement jamais saisir RegEx. Donc, une autre question serait, pouvez-vous fournir le RegEx, mais un peu d'expliquer ce que chaque partie est pour?

+2

L'utilisation de str.split (":") n'est pas une option? – extraneon

Répondre

1

Vous devriez mettre les entrées dans un dictionnaire, pas dans autant de variables séparées - clairement, les clés que vous utilisez n EED PAS être acceptable comme noms de variables (ce slash dans 'Url/Host' serait un tueur! -), mais ils seront très bien comme des clés de chaîne dans un dictionnaire.

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 
        ''') 

puis

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 

la possibilité de faire des modèles de RE « bavard » (en les commençant par (?x) ou en utilisant re.VERBOSE comme second argument à re.compile) est très utile pour vous permettre de clarifier votre RE avec des commentaires et des espaces bien alignés. Je pense que c'est malheureusement sous-utilisé ;-).

+0

Bonne réponse et bonne explication. Je pense que j'aimerais que les espaces blancs potentiels soient supprimés. Je crois que cela pourrait être fait en ajoutant \ s * entre le groupe de valeur et l'ancre de fin de ligne '$'? – extraneon

+0

AttributeError: l'objet 'NoneType' n'a pas d'attribut 'group' – Rob

+0

@Rob, vous voulez dire 'groups', pas' group'. Oui, j'ai oublié d'ajouter le 'continuer' évidemment nécessaire pour ** faire ** le saut, laissez-moi l'ajouter.BTW, votre question ne mentionne pas qu'il peut y avoir des lignes qui ne correspondent pas à ce modèle, et que faire lorsque ces lignes sont trouvées - s'il vous plaît modifier votre Q pour ajouter cette information cruciale! –

0

Eh bien, si vous ne savez pas regex, changez simplement vous produisez comme ceci:

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

Et utiliser le module python ConfigParser http://docs.python.org/library/configparser.html

+0

Modifier le fichier n'est pas vraiment une option, mais merci – Rob

+0

ConfigParser supporte le délimiteur ':' http://stackoverflow.com/questions/2845018/extracting-data-from-a-text-file-to-use-in -a-python-script/2845923 # 2845923 – jfs

0

EDIT: Une meilleure solution

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

Pour un fichier aussi simple que cela, vous n'avez pas vraiment besoin d'expressions régulières. Les fonctions de chaîne sont probablement plus faciles à comprendre. Ce code:

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) 

fera le travail et les résultats dans:

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

Module ConfigParser prend en charge delimiter ':'.

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")) 

Sortie:

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

Bien qu'un regex ou analyse manuelle peut être plus approprié dans votre cas.

Questions connexes