微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

不允许某些文件名的模式

如何解决不允许某些文件名的模式

我正在从以“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 年

解决方法

使用正则表达式的第一种方法

(?!...)

如果 ... 不匹配则匹配 next。这是一个否定的前瞻断言。


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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。