不允许某些文件名的模式
Pattern to not allow certain file names
我正在从以 '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_617901_0
buy_train_2018-12-19_492111_0
-> 上面的例子应该被过滤掉,因为它们在 'buy_train'
之后有 2018
使用正则表达式的第一种方法
(?!...)
匹配如果...下一个不匹配。这是一个否定的先行断言。
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
第二种带过滤原生功能的方法:
但您不一定需要使用正则表达式进行过滤,只需使用例如本机 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
我正在从以 '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'.
之后没有 2018buy_train_2018-10-16_617901_0
buy_train_2018-12-19_492111_0
-> 上面的例子应该被过滤掉,因为它们在 'buy_train'
之后有 2018使用正则表达式的第一种方法
(?!...)
匹配如果...下一个不匹配。这是一个否定的先行断言。
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
第二种带过滤原生功能的方法:
但您不一定需要使用正则表达式进行过滤,只需使用例如本机 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