模式不允许使用某些文件名



我正在从一个以"buy_train_"开头、以0结尾的目录中读取一些文件。

data = [pd.read_parquet(f,engine='fastparquet') for f in glob.glob(local_data_path+'buy_train_20**-**-**_****_0')]

我需要更新这个正则表达式,这样它就不会包括名称以"buy_train_2018"开头的文件,也就是说,如果文件有2018,那么绕过它。但我仍然需要根据第一个正则表达式过滤掉文件,这只是我想添加的另一个过滤器。当我试着做一个像下面这样的表达时,有人能帮我吗

buy_train_20**(?![8])-**-**_**_0

这本应该过滤掉任何以8结尾的内容,但它没能做到

感谢您的帮助。

第1版:

示例-

buy_train_2020-01-08_001221_0

buy_train_2020-05-02_067341_0

buy_train_2020-07-26_011901_0

>上面的示例将是可接受的文件名,因为它们在"buy_train"之后没有2018。

buy_train_2018-10-16_61701_0

buy_train_2018-12-19_492111_0

>上面的例子应该像2018年在"buy_train"之后一样被过滤掉

第一个使用regex的方法

(?!…(

匹配如果。。。与下一个不匹配。这是一个消极的前瞻性断言。


import re
regex_filter = 'buy_train_20(?!18)d*-d*-d*_d*_0'
expr1 = 'buy_train_2018-10-16_617901_0'
m = re.search(regex_filter, expr1)
print(m)
# None 
# (if None not do not try to print)
expr2 = 'buy_train_2020-01-08_001221_0'
m = re.search(regex_filter, expr2)
print(m)
print(m.group(0))
# <_sre.SRE_Match object; span=(0, 29), match='buy_train_2020-01-08_001221_0'>
# buy_train_2020-01-08_001221_0

具有过滤本机功能的第二种方法:

但您不一定需要使用regex进行过滤,只需使用本机filter函数即可,如下所示:

paths = ['buy_train_2020-01-08_001221_0',
'buy_train_2020-05-02_067341_0',
'buy_train_2020-07-26_011901_0',
'buy_train_2018-10-16_617901_0',
'buy_train_2018-12-19_492111_0']

prefix = 'buy_train_2018'
def function(path):
if path[:len(prefix)] == prefix:
return False
else:
return True
results = filter(function, paths)
for res in results:
print (res)

# buy_train_2020-01-08_001221_0
# buy_train_2020-05-02_067341_0
# buy_train_2020-07-26_011901_0

最新更新