2017-11-27 12 views
0

ファイルの一覧でファイル拡張子の一部を置き換えようとしています。アイテム(ファイル)をループして拡張機能を削除したいと考えています。 3番目のパラメータが文字列を必要とするため、リスト内の項目を適切にループする方法がわかりません。例えば。 re.sub(パターン、REPL、文字列、カウント= 0は、フラグ= 0)リスト内の文字列を置換する(re.subを使用)

import re 

file_lst = ['cats1.fa', 'cats2.fa', 'dog1.fa', 'dog2.fa'] 
file_lst_trimmed =[] 

for file in file_lst: 
    file_lst_trimmed = re.sub(r'1.fa', '', file) 

ここで生じる問題は、re.subは、文字列を期待して、私は文字列のリストをループにそれをしたいです。

アドバイスありがとうございます!

+0

あなたの質問を明確にすることはできますか?期待される結果は何ですか?あなたはすべてのファイル名から最後の数字と '.fa'を削除しますか? – James

+0

はい最後の番号と内線番号を削除します。 – Graeme

答えて

1

を試してみてください。 \dは1文字に一致する正規表現で、$は文字列の最後にのみ一致します。

file_lst_trimmed = [re.sub(r'\d\.fa$', '', file) for file in file_lst] 

結果:正規表現のための

>>> file_lst_trimmed 
['cats', 'cats', 'dog', 'dog'] 
0

可能であれば、ライブラリをインポートして使用するのではなく、内部関数をPythonにすることをお勧めします。このような単純なタスクにregexを使用するのは、これを実行する最良の方法ではないかもしれません。このアプローチはきれいに見えます。

はあなたがクリーンアップファイル名で新しいリストを構築するために、リストの内包表記を使用することができ、この

file_lst = ['cats1.fa', 'cats2.fa', 'dog1.fa', 'dog2.fa'] 
file_lst_trimmed =[] 
for file in file_lst: 
    file_lst_trimmed.append(file.split('.')[0][:-1]) 
0

必要はありません、このため標準ライブラリosos.path.splittextを使用しています。

スプリット対にパス名経路(ルート、EXT)ようにルート+ EXT ==経路、およびextは空であるか周期で始まり、多くても1つの期間に含まれています。 basenameの先頭の期間は無視されます。 splitext( '。cshrc')は( '.cshrc'、 '')を返します。

import os.path 

l = ['hello.fa', 'images/hello.png'] 

[os.path.splitext(filename)[0] for filename in l] 

戻り

['hello', 'images/hello'] 
0

あなたのループが実際に完全に罰金です!他にも2つの問題があります。

  1. ループの繰り返しごとにfile_lst_trimmedを文字列に設定しています。 file_lst_trimmed.append("apple")のようにappendを使用します。

  2. 正規表現は、実際には'.fa'にする必要があります(.fa拡張子のみを削除したいと仮定して)'1.fa'です。

編集:最後の数字も削除します。その場合、'\d+\.fa'\dは任意の数字のスタンドインで、\d+は任意の長さの数字の文字列を意味するので、10,11,13254などを削除します。\ before .は、.がエスケープする必要がある特殊文字であるためです)。任意のファイル拡張子を削除する場合は、fa-任意の長さの文字列の代わりに\w+を入力します。あなたはdocumentation for regex.

1

をチェックアウトする場合がありますあなたはこれを試すことができます。

import re 
file_lst = ['cats1.fa', 'cats2.fa', 'dog1.fa', 'dog2.fa'] 
final_list = [re.sub('\d+\.\w+$', '', i) for i in file_lst] 

出力:

['cats', 'cats', 'dog', 'dog'] 
+0

確かに最高のコードですが、正規表現は不慣れな人には不器用なように見えます。あなたの答えがなぜそれと同じように機能するのかを説明するといいでしょう。 OPのチートシート:https://docs.python.org/2/library/re.html#regular-expression-syntax – colopop

関連する問題