我的字符串中有以下范围:
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()”是错误的,但这只是为了给出一个想法,我想迭代列表中的自定义范围。
您可以在不构建
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
来完成此操作。