2016-06-22 8 views
1

私は、与えられた接頭辞を持つすべてのファイルを見つけ出す小さなプログラムを書いていました。この例では'spam'と言うと、フォルダ内に番号を付け、ギャップを埋めるために後続のフォルダの名前を変更します。以下は、正規表現を使用してファイルを検索し、その名前を変更し、プログラムの一部を示しています正規表現とファイル名の変更

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

私は上から期待していた何spam005.txtだったが、代わりに私が@5.txt

を得た私はr'%s%s\4' % (prefix, newNumber)を使用することができます考え出しました代わりに意図したとおりに動作しますが、なぜこのエラーが発生しているのか理解したいと思います。それはre.compile()の間に使用された%sと関係がありますか?

答えて

1

ここでは二つの問題があります。

あなたnewNumberは、あなたがそれを整数として解釈されているときに最初の2 0がドロップされるよう、それは005になりたい場合は、文字列にする必要があるが。

あなたの次の問題は本当にあなたの代わりになります。書式設定する文字列を使用すると、新しい正規表現\15\4が作成されます(5を参照してください。newNumber)。 Pythonがこれを見ると、グループ15を取得しようとし、group 1ではなく、5という文字列を取得しようとします。あなたの目的の動作を取得するには、このようgでの参照を囲むことができます:\g<1>5\4

だからあなたのコードは、このように変更する必要があります\g<n>行動について

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

詳しい情報は、最後に見つけることができますre.sub doucmentation