2017-03-01 44 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))