2017-03-01 15 views
0

ファイルパスのリストがあります。ファイル名には検索する必要があるものが含まれています。 C:\PATH\PATH\PATH\PATH\THE_THING_I_NEED.xslxPython Regexエラー

Pythexを使用して、私は正規表現を作成し、私が欲しいものを正確に選びます。 \.xslxの間にあるものはどれですか。以下のコードであり、私が取得エラー:

import re 
files = ['C:\\PATH\\PATH\\PATH\\thing1.xlsx', 'C:\\PATH\\PATH\\PATH\\PATH\\thing2.xlsx'] 

pattern = re.compile('(?<=\\)?[a-zA-Z]+(?=\.xlsx)') 
for x in files: 
    matches =re.findall(pattern, x) 
    print(matches) 

#error i get below 
error: missing), unterminated subpattern at position 0 

だから私は余分な)を追加し、エラーを次し、それが動作します:

pattern = re.compile('(?<=\\))?[a-zA-Z]+(?=\.xlsx)') 
#       ^added right there 

正確に余分な)がやっていることは何ですか? Pythexはそれを必要としないようで、私の目には不要です。

+0

です。そのため、生の文字列リテラ正規表現をPythonで定義するときに使えます。 –

+3

余分なものは必要ありません)、余分な\\が必要です。 –

+1

ファイルパスからデータを抽出しようとしている場合は、正確にその目的のために存在する 'os.path'の関数の使用を検討してください。 'os.path.splitext(os.path.split( 'C:¥¥PATH¥¥PATH¥¥PATH¥¥thing1.xlsx')[1])' [0] '' thing1 "'を返します。 – Kevin

答えて

2

間違ったツールを使用しています。私はあなたが達成したいもののためにosモジュールをお勧めします:

import os 

files = ['C:\\PATH\\PATH\\PATH\\thing1.xlsx', 'C:\\PATH\\PATH\\PATH\\PATH\\thing2.xlsx'] 
for file in files: 
    base = os.path.basename(file) 
    print(os.path.splitext(base)[0]) 

これは正確に何をしたい出力します:

thing1 
thing2 

ます。また、ワンライナーとしてこれをラップすることができますコメントに記載されている関数の中で:

import os 


def get_filename(files): 
    return [os.path.splitext(os.path.basename(file))[0] for file in files] 

if __name__ == '__main__': 
    files = ['C:\\PATH\\PATH\\PATH\\thing1.xlsx', 'C:\\PATH\\PATH\\PATH\\PATH\\thing2.xlsx'] 
    print(get_filename(files))