2017-12-04 16 views
-1

バージョン管理されたファイルのベース名を返す正規表現を作成しようとしていましたが、同じリストのバージョン管理されていないファイルのベース名。バージョンタグの有無にかかわらずファイル名の "basenames"を返そうとしています

import re 

file_list = [ 
    "ThisFile_v01.ext", 
    "ThisFile_v02.ext", 
    "ThatFile_v01.ext", 
    "ThatFile_v02.ext", 
    "NonVersionedFile.ext", 
    "Non_VersionedFile.ext", 
] 

r = re.compile(r"^(?P<basename>.*(?!_v))(?P<version>_v\d+\.)?(?(version).*$|\..*$)") 
for f in file_list: 
    match = r.match(f) 
    print(match.group('basename')) 

私はこのようなリストを返すようにしようとしている:私は現在、この取得してい

ThisFile 
ThisFile 
ThatFile 
ThatFile 
NonVersionedFile 
Non_VersionedFile 

ThisFile_v01 
ThisFile_v02 
ThatFile_v01 
ThatFile_v02 
NonVersionedFile 
Non_VersionedFile 

を、私はそれを考える上で、おそらくだが、私はしました多くの反復を経ていて、私はこのことを理解できないようです。どんな助けもありがとう。

答えて

0

あなたの正規表現は私にわずかな頭痛を与えます。私は、すべてのオプション部分の間に矛盾があると思います。

(オプション)&拡張子を削除するだけではなく、subを使用してください。

r = re.compile("(_v\d+)?(\..*)") 
for f in file_list: 
    print(r.sub("",f)) 

これは簡単で、私を与える:あなたの正規表現に

ThisFile 
ThisFile 
ThatFile 
ThatFile 
NonVersionedFile 
Non_VersionedFile 
+0

うん、私はそれを完全に考えていた。ありがとう! –

0

スーパー簡単な変更はあなたの問題を修正します。あなたの正規表現の根本的な問題は、あなたが "欲張りな"呼び出しを使用していたことでした。あなたが "貪欲でない"と言えば、あなたは望みの結果を得るでしょう。

r = re.compile(r"^(?P<basename>.*?)(?P<version>_v[0-9]+)?\.ext")

上記の正規表現は、ベース名の検索が最小限であると強制的に.*を意味するとすぐにそれができるの代わりに、すべての文字をgobblingとして検索を停止します(グループの終わりに?はという原因です)それは手を上げることができます。

関連する問題