python模式不允许某些文件名

4smxwvx5  于 2021-07-13  发布在  Java
关注(0)|答案(2)|浏览(269)

我正在从一个目录中读取一些文件,该目录以“buy\u train\u”开头,以0结尾。

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

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

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

它本应该过滤掉任何以8结尾的内容,但它没有这样做。
感谢您的帮助。
编辑1:
示例-
购买列车2020-01-08
购买火车\u 2020-05-02 \u 067341 \u 0
购买火车\u 2020-07-26 \u 011901 \u 0
->以上示例将是可接受的文件名,因为它们在“购买火车”之后没有2018。
购买列车2018-10-16\617901\0
购买列车2018-12-19\492111\0
->上面的例子应该被过滤掉,因为它们在“购买火车”之后有2018年

jmo0nnb3

jmo0nnb31#

正则表达式的第一个方法
(?!...)
如果匹配。。。与下一个不匹配。这是一个消极的前瞻性Assert。

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进行过滤,只需使用本机过滤函数,如下所示:

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
2o7dmzc5

2o7dmzc52#

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'`enter code here`
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

相关问题