2017-03-01 71 views
0

我有一個文件路徑的列表,文件名包含我需要檢索的東西。 C:\PATH\PATH\PATH\PATH\THE_THING_I_NEED.xslxPython的正則表達式錯誤

使用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))