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

2024-06-02 07:54:50 发布

您现在位置:Python中文网/ 问答频道 /正文

我有以下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中使用regex,但不知道怎么做。此外,解决方案需要可扩展,不依赖于实际名称,例如chattisgarh


Tags: andcsv名称列表解决方案单词regexaa
3条回答

您可以在这里使用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']}

这里有一种获取字典的方法,其中每个“name”键的值都是以该名称开头的字符串列表,保持原始列表的顺序。它不使用regex,实际上根本不使用模块。您可以轻松地修改它以生成函数、从每个名称中删除尾随下划线、检查数据列表中的各种错误、从字典中获取结果列表等等。你知道吗

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

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)

此代码的结果(美化)为

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

相关问题 更多 >