基于正则表达式的python列表拆分

基于正则表达式的python列表拆分,python,regex,Python,Regex,我有以下python列表: ['chhattisgarh_2015_aa.csv', 'chhattisgarh_2016_aa.csv', 'daman_and_diu_2000_aa.csv', 'daman_and_diu_2001_aa.csv', 'daman_and_diu_2002_aa.csv'] 如何将其分为两个列表: ['chhattisgarh_2015_aa.csv', 'chhattisgarh_2016_aa.csv'] and ['daman_and_diu_20

我有以下python列表:

['chhattisgarh_2015_aa.csv', 'chhattisgarh_2016_aa.csv', 'daman_and_diu_2000_aa.csv', 'daman_and_diu_2001_aa.csv', 'daman_and_diu_2002_aa.csv']
如何将其分为两个列表:

['chhattisgarh_2015_aa.csv', 'chhattisgarh_2016_aa.csv'] and ['daman_and_diu_2000_aa.csv', 'daman_and_diu_2001_aa.csv', 'daman_and_diu_2002_aa.csv']
这些名单是根据2000年之前的单词来划分的


我知道我应该在python中使用正则表达式,但不知道如何使用。此外,解决方案需要可扩展且不依赖于实际名称,例如chattisgarh,这里有一种获取字典的方法,其中对于每个“名称”键,值是以该名称开头的字符串列表,保持原始列表的顺序。这不使用正则表达式,实际上根本不使用模块。您可以轻松地对此进行修改以生成函数、从每个名称中删除尾随下划线、检查数据列表中的各种错误、从字典中获取结果列表,等等

如果您允许其他模块,或者允许更改顺序,我相信还有其他方法

a = ['chhattisgarh_2015_aa.csv', 'chhattisgarh_2016_aa.csv',
     'daman_and_diu_2000_aa.csv', 'daman_and_diu_2001_aa.csv',
     'daman_and_diu_2002_aa.csv']

names_dict = {}
for item in a:
    # Find the first numeric character in the item
    for i, c in enumerate(item):
        if c.isdigit():
            break
    # Store the string in the dictionary according to its preceding characters
    name = item[:i]
    if names_dict.get(name, None):
        names_dict[name].append(item)
    else:
        names_dict[name] = [item]

print(names_dict)
此代码(美化)的结果为


您可以在此处使用
itertools.groupby

import itertools
import re

list = ['chhattisgarh_2015_aa.csv', 'chhattisgarh_2016_aa.csv',
        'daman_and_diu_2000_aa.csv', 'daman_and_diu_2001_aa.csv',
        'daman_and_diu_2002_aa.csv']

grouped = itertools.groupby(sorted(list), lambda x: re.match('(.+)_\d{4}', x).group(1))    

for (key, values) in grouped:
    print(key)
    print([x for x in values])

regex
(.+)\d{4}
匹配一组至少包含一个字符(这是我们的分组依据)的字符,后跟下划线和4位数字。

将正则表达式与字典结合使用的另一个选项:

files = ["chhattisgarh_2015_aa.csv", "chhattisgarh_2016_aa.csv", "daman_and_diu_2000_aa.csv", "daman_and_diu_2001_aa.csv", "daman_and_diu_2002_aa.csv"]

import re
from collections import defaultdict

groupedFiles = defaultdict(list)
for fileName in files:
    pattern = re.findall("(.*)\\d{4}", fileName)[0]
    groupedFiles[pattern].append(fileName)

groupedFiles

{'chhattisgarh_': ['chhattisgarh_2015_aa.csv',
                   'chhattisgarh_2016_aa.csv'],
 'daman_and_diu_': ['daman_and_diu_2000_aa.csv',
                    'daman_and_diu_2001_aa.csv',
                    'daman_and_diu_2002_aa.csv']}

谢谢@RoryDaulton,元素是字符串。更新了我的问题,以反映您是否可以根据第一个
之前的文本执行此操作?比如使用
name.partition(“”)[0]
来比较标题?但是,如果您有类似“foo\u bar\u 2000”和“foo\u foo\u 2000”这样的标题,这将不起作用。因为不同的列表元素可以有不同数量的
\uu
您确定年份包含每个列表中的第一个数字字符吗?是的,年份包含列表中的第一个也是唯一一个数字字符
files = ["chhattisgarh_2015_aa.csv", "chhattisgarh_2016_aa.csv", "daman_and_diu_2000_aa.csv", "daman_and_diu_2001_aa.csv", "daman_and_diu_2002_aa.csv"]

import re
from collections import defaultdict

groupedFiles = defaultdict(list)
for fileName in files:
    pattern = re.findall("(.*)\\d{4}", fileName)[0]
    groupedFiles[pattern].append(fileName)

groupedFiles

{'chhattisgarh_': ['chhattisgarh_2015_aa.csv',
                   'chhattisgarh_2016_aa.csv'],
 'daman_and_diu_': ['daman_and_diu_2000_aa.csv',
                    'daman_and_diu_2001_aa.csv',
                    'daman_and_diu_2002_aa.csv']}