J'ai ce fichier Le fichier dat code> que j'ai besoin d'obtenir des informations sur les utilisateurs. code> ressemble à ceci: p> with open("users.dat") as open_file:
data = open_file.read()
x = re.findall("USER ([^\s]+)", data)
3 Réponses :
Vous pouvez utiliser un motif comme Alors maintenant, il vous suffit de prendre chaque groupe et de la casser sur des espaces puis de l'attribuer à la bonne personne. P> \ r | \ n \ s \ s \ s \ s ([A-Z0-9 \ -] + \ s) + code> 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. P>
Pas le plus beau code, mais cela fonctionne:
{'john': ['office', 'docker', 'cluster1'], 'maria': ['financial', 'server', 'office'], 'clarke': ['active', 'directory', 'gsuite', 'cluster1', 'cluster2', 'admin']}
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']}