迭代字符串列表/范围,同时指定自定义开始和停止

问题描述 投票:0回答:1

我的字符串中有以下范围:

MyRange = 'IDxxx8:IDxxxC'

我想用以下方式打破它:

MyRange = 'IDxxx8, IDxxx9, IDxxxA, IDxxxB, IDxxxC'

最后一个字符应为 1-9,然后是 A-Z。预定义的扩展范围将来自此列表:

expected_range = [str(i) for i in range(0, 10)]
alphabet_range = [chr(i) for i in range(ord('A'), ord('Z') + 1)]
expected_range.extend(uppercase_alphabet_range)
# resulting in : expected_range = ['0','1','2',...,'8','9','A','B','C',..,'Y','Z']

我有以下代码,但我不知道如何在自定义范围内执行 for 循环,将生成的正则表达式组作为开始和停止。我不知道如何从这里开始:

re.sub(r'(ID.{3})(.{1}):\1(.{1})$', (lambda m: ','.join(m.group(1) + str(i) for i in expected_range( m.group(2), m.group(3)) + 1), MyRange))

我知道以这种方式使用“expected_range()”是错误的,但这只是为了给出一个想法,我想迭代列表中的自定义范围。

python python-3.x
1个回答
0
投票

您可以在不构建

expected_range
列表的情况下执行此操作,例如:

import re


def my_expand(prefix, a, b):
    r = map(chr, range(ord(a), ord(b) + 1) if a < b else range(ord(a), ord(b) - 1, -1))
    return ", ".join(f"{prefix}{v}" for v in r if ("0" <= v <= "9") or ("A" <= v <= "Z"))


# MyRange = "IDxxxC:IDxxx8" # it works backwards too
MyRange = "IDxxx8:IDxxxC"

out = re.sub(
    r"(ID.{3})([0-9A-Z]):\1([0-9A-Z])",
    lambda x: my_expand(x[1], x[2], x[3]),
    MyRange,
)

print(out)

打印:

IDxxx8, IDxxx9, IDxxxA, IDxxxB, IDxxxC

或者,您可以按照 jasonharper 在评论中建议的方式使用

str.index
来完成此操作。

© www.soinside.com 2019 - 2024. All rights reserved.