2017-06-20 5 views
0

Ich mache einige (Anfänger) Programmierung in ipython 5.1.0.ipython, spezifische Verzeichnisse finden

Es gibt ungefähr 100 Verzeichnisse mit Namen wie Mix_XFUEL_0.5_XOXID_0.6_PHI_0.2, nur die Zahlen ändern sich.

Ich benutze fnmatch, um die Namen in das Programm zu lesen. Jetzt muss ich alle Verzeichnisse, in denen die ersten beiden Zahlen (hinter XFUEL und XOXID) sind identisch, wie:

Mix_XFUEL_0.5_XOXID_0.5_PHI_0.2 
Mix_XFUEL_0.5_XOXID_0.5_PHI_0.4 
Mix_XFUEL_0.5_XOXID_0.5_PHI_0.6 

aber auch

Mix_XFUEL_0.6_XOXID_0.6_PHI_0.2 
Mix_XFUEL_0.6_XOXID_0.6_PHI_0.4 
Mix_XFUEL_0.6_XOXID_0.6_PHI_0.6 

Ich habe versucht:

i = '0.5' 
fnmatch.fnmatch(file, 'Mix_XFUEL_'i'_XOXID_'i'_PHI_*'): 

aber es wird nicht funktionieren.

Wie kann es gemacht werden?

Antwort

0

Verwendung Regex, 2. Capture-Gruppe (\1) behauptet, dass es die erste Capture-Gruppe (\d+(?:\.\d+)?)

(\d+(?:\.\d+)?) Spiel jede Dezimalzahl oder Zahl mit Nachkommastellen

import re 
re.match(r'Mix_XFUEL_(\d+(?:\.\d+)?)_XOXID_(\1)_PHI', infile) 

dies übereinstimmen übereinstimmen müssen

  • "Mix_X FUEL_0.5_XOXID_0.5_PHI_0.2"
  • "Mix_XFUEL_0.6_XOXID_0.6_PHI_0.2"
  • "Mix_XFUEL_5_XOXID_5_PHI_0.2"

aber nicht

  • „Mix_XFUEL_0.5_XOXID_0.6_PHI_0.2 "
+0

Große Antwort, danke. Ich werde tiefer in Regex gehen ... – newbieTheNewest

0
import os, re 
from collections import defaultdict 

results = defaultdict(list) 
for file in os.listdir('/path/to/your/directory'): 
    m = re.match(r'Mix_XFUEL_(.*?)_XOXID_(.*?)_PHI_.*', file) 
    if m: 
     numbers = m.group(1,2) 
     results[numbers].append(file) 

for r in results: 
    print(results[r]) 
+0

Danke. Der Code "um" den Regex hilft mir auch sehr. Kombiniert mit Regex von der anderen Antwort passt das recht gut. – newbieTheNewest

Verwandte Themen