列表

时间:2018-06-04 06:46:53

标签: python regex performance

我有一个来自os.listdir()的字符串列表,如下所示:

['foo',
 'bar'
 'backup_20180406'
 ...]

在这些条目中,我想获得与“backup_YYYYMMDD”模式相匹配的条目。具有命名组的正则表达式将是

regex = r"BACKUP_(?P<date>\d+)"

我正在尝试创建一个包含上面 date only 的列表(也就是.group('date')),但是如果不解析字符串两次,我找不到办法。

res = [re.search(regex, x).group('date') for x in filter(r.match, os.listdir(folder))]

我确信我错过了一些非常明显和简洁的内容,那么有更好的方法吗?

3 个答案:

答案 0 :(得分:3)

这是一个使用extract()的Pandas解决方案:

import pandas as pd

strings = ['foo', 'bar', 'backup_20180406']
regex = r"backup_(?P<date>\d+)"

pd.Series(strings).str.extract(regex).dropna()

2    20180406
Name: date, dtype: object

答案 1 :(得分:3)

我通常会这样做:

regex = re.compile(r"BACKUP_(?P<date>\d+)")
a = ['foo', "BACKUP_20180406", 'xxx']
matches = [regex.match(x) for x in a]
valid = [x.group('date') for x in matches if x]

或者只是

valid = [x.group('date') for x in (regex.match(y) for y in a) if x]

答案 2 :(得分:-1)

如果您正在测试一个简单的模式,正则表达式很少是最有效的工具。 只需使用startswith就可以快两倍。

df3 = df1.join(df2,on='Product')