2016-06-22 14 views
1

Ich schrieb ein kleines Programm, das alle Dateien mit gegebenem Präfix, sagen wir 'spam' für dieses Beispiel, in einem Ordner findet und Lücken in der Nummerierung findet und nachfolgende Ordner umbenennt, um die Lücke zu füllen. Im Folgenden zeigt ein Teil des Programms, das die Dateien mit einem regex und benennt sie lokalisiert:Regex und Umbenennen Dateifehler

prefix = 'spam' 
newNumber = 005 

# Regex for finding files with specified prefix + any numbering + any file extension 
prefixRegex = re.compile(r'(%s)((\d)+)(\.[a-zA-Z0-9]+)' % prefix) 

# Rename file by keeping group 1 (prefix) and group 4 (file extension), 
# but substituting numbering with newNumber 
newFileName = prefixRegex.sub(r'\1%s\4' % newNumber, 'spam006.txt') 

Was ich von oben spam005.txt war erwartet wurde, aber stattdessen habe ich @5.txt

ich mich r'%s%s\4' % (prefix, newNumber) heraus verwenden könnte Stattdessen und dann funktioniert es wie beabsichtigt, aber ich würde gerne verstehen, warum dieser Fehler passiert. Hat es etwas mit der %s zu tun, die während re.compile() verwendet wird?

Antwort

1

Es gibt zwei Probleme:

Ihre newNumber Bedürfnisse ein String sein, wenn Sie es wollen 005 wie die ersten beiden 0 fallen gelassen werden, wenn es als eine ganze Zahl interpretiert wird.

Ihr nächstes Problem ist in der Tat in Ihrer Ersetzung. Mit der String-Formatierung erstellen Sie effektiv die neue Regexp \15\4 (siehe 5 dort, das war Ihre newNumber). Wenn Python dies sieht, versucht es, die Erfassungsgruppe 15 und nicht group 1 gefolgt von einem Literal 5 zu erhalten. Sie können die Referenz in einer g wie diese umschließen Ihre gewünschte Verhalten zu erhalten: \g<1>5\4

So Ihr Code diese geändert werden muss:

prefix = 'spam' 
newNumber = '005' 

# Regex for finding files with specified prefix + any numbering + any file extension 
prefixRegex = re.compile(r'(%s)((\d)+)(\.[a-zA-Z0-9]+)' % prefix) 

# Rename file by keeping group 1 (prefix) and group 4 (file extension), 
# but substituting numbering with newNumber 
newFileName = prefixRegex.sub(r'\g<1>%s\4' % newNumber, 'spam006.txt') 

Weitere Informationen über das \g<n> Verhalten kann am Ende gefunden werden der re.sub doucmentation

Verwandte Themen