0
votes

Obtenir la correspondance Regex sur les données semi-structurées - DAT Fichier

J'ai ce fichier dat code> que j'ai besoin d'obtenir des informations sur les utilisateurs.

Le fichier code> ressemble à ceci: p>

with open("users.dat") as open_file:
    data = open_file.read()

x = re.findall("USER ([^\s]+)", data)


0 commentaires

3 Réponses :


0
votes

Vous pouvez utiliser un motif comme \ r | \ n \ s \ s \ s \ s ([A-Z0-9 \ -] + \ s) + pour correspondre à n'importe quel nombre de mots y compris des chiffres ou des traits d'union, mais seulement des minuscules. En supposant que cela fonctionnera en fonction de l'exemple que vous avez fourni. Il semble d'abord pour une nouvelle ligne ou un nouveau caractère de retour, puis quatre espaces.

Alors maintenant, il vous suffit de prendre chaque groupe et de la casser sur des espaces puis de l'attribuer à la bonne personne.


0 commentaires

1
votes

Pas le plus beau code, mais cela fonctionne:

{'john': ['office', 'docker', 'cluster1'], 'maria': ['financial', 'server', 'office'], 'clarke': ['active', 'directory', 'gsuite', 'cluster1', 'cluster2', 'admin']}


0 commentaires

1
votes

Vous pouvez écrire une fonction pour traiter chaque bloc du fichier au lieu de s'appuyer sur regex (en supposant qu'ils vont tous être comme ceux de l'exemple):

def parse_user(user_string):
    lines = [l.strip() for l in user_string.split('\n')]
    # Get the name.
    name = lines[0].split(' ')[1]
    # Filter out blank strings and the final two entries.
    privileges = [p for p in lines[-1].split(' ') if p][:-2]
    return name, privileges

results = {n:ps for n, ps in [parse_user(user_string) in data.split('\n\n')]}

Out[30]: 
{'john': ['office', 'docker', 'cluster1'],
 'maria': ['financial-server', 'office'],
 'clarke': ['active-directory', 'gsuite', 'cluster1', 'cluster2', 'admin']}


0 commentaires