展开类似于A1-A4

时间:2018-05-31 09:32:57

标签: python list

我试图在python中为我的程序添加一个函数,扩展了字母数字字符串范围。

input = "A1-A4"

创建扩展范围作为列表:

output = [A1, A2, A3, A4]

我已经查看了以前在Expand a range which looks like: "1-3,6,8-10" to [1,2,3, 6, 8,9,10]中扩展数值范围的类似答案。但是,所提供的解决方案无法处理字母数字范围。

我尝试使用正则表达式提取第一个字符,并与下面的Austin结合使用(第一次没有正确提问):

str = 'B1-B4'
word1 = " ".join(re.findall("[a-zA-Z]+", str))
letter=word1[0]
ranges = [int(s) for s in str if s.isdigit()]
new_string=([f'letter{i}' for i in range(ranges[0], ranges[1]+1)])

然而,输出并没有通过这封信。我也不认为上面的过程是最符合逻辑的。

谢谢!

3 个答案:

答案 0 :(得分:3)

这使用regex扩展范围:

import re

str = 'A1-A4'
chr = str[0]
ranges = list(map(int, re.findall(r'\d+', str)))
print([f'{chr}{i}' for i in range(ranges[0], ranges[1]+1)])

# ['A1', 'A2', 'A3', 'A4']

答案 1 :(得分:1)

这是一种变体,它使用匹配字母和数字的模式,包括字母相同,然后使用替换函数应用它们。

const infos = [
    {
        "resourceName":"name1",
        "id":"id1",
        "emailAddresses":[
            { "metadata":{ "primary":true,  "source":{ "type":"CONTACT", "id":"m1" } , "value":"email1@example.com"}},
            { "metadata":{ "primary":false, "source":{ "type":"CONTACT", "id":"m2" } , "value":"email2@example.com"}}
        ]
    },
    {
        "resourceName":"name2",
        "id":"id2",
        "emailAddresses":[
            { "metadata":{ "primary":true,  "source":{ "type":"FAMILY", "id":"m3" } , "value":"email3@example.com"}},
            { "metadata":{ "primary":false, "source":{ "type":"CONTACT", "id":"m4" } , "value":"email4@example.com"}},
            { "metadata":{ "primary":false, "source":{ "type":"BUSINESS", "id":"m5" } , "value":"email5@example.com"}}
        ]
    },
    {
        "resourceName":"name3",
        "id":"id3",
        "emailAddresses":[
            { "metadata":{ "primary":true,  "source":{ "type":"CONTACT", "id":"m5" } , "value":"email6@example.com"}},
            { "metadata":{ "primary":false, "source":{ "type":"FAMILY", "id":"m6" } , "value":"email7@example.com"}}
        ]
    }
];

const search_email = "email4@example.com";
let parent_key = null;

infos.forEach( info => {
    info.emailAddresses.forEach( ema => {
        if ((ema.metadata.source.type === 'CONTACT') && (ema.metadata.value === search_email )) {
            parent_key = info.id;
        }
    })
});

if ( parent_key === null) {
    console.log('NOT FOUND');
} else {
    console.log('FOUND - PARENT KEY: ', parent_key);
}

答案 2 :(得分:1)

您也可以

input = "A1-A4"
l = input[1:].split('-')
['A'+str(x) for x in range(int(l[0]), int(l[1][1:])+1)]

首先使用-作为分隔符将字符串拆分为2个部分。然后是两个片段的数量

即使输入为

,此方法也能正常工作
input = "A23-A29"

在这种情况下输出将是

['A23', 'A24', 'A25', 'A26', 'A27', 'A28', 'A29']

根据需要更改字母。