将range表达式转换为lis的Pythonic方法

2024-04-20 08:16:36 发布

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

将典型的字符串范围表达式(如指定页面范围打印机)转换为

'1-4,6'
'3,5-8,12-14'

进入列表

[1, 2, 3, 4, 6]
[3, 5, 6, 7, 8, 12, 13, 14]

这是一个脑筋急转弯,我知道如何用一种老生常谈的方式使用字符串操作和循环。你知道吗


Tags: 字符串列表表达式方式打印机页面典型脑筋
2条回答

您可以使用以下功能:

def dashrange(s):
    if "-" in s:
        a, b = map(int, s.split("-"))
        return range(a, b + 1)
    return [int(s)]

def range_to_list(s):
    return [j for i in s.split(",") for j in dashrange(i)]

印刷品:

[1, 2, 3, 4, 6]
import re

range_expr = '1-4,6,9-11'

ranges = []
for r in re.finditer(r'\d+(?:-\d+)?(?=(,|\Z))', range_expr):
    if '-' in r.group(0):
        l = list(map(int, r.group(0).split('-')))
        l[1] += 1
        ranges.extend(list(range(*l)))
    else:
        ranges.append(int(r.group(0)))

print(ranges)

印刷品:

[1, 2, 3, 4, 6, 9, 10, 11]

验证范围并允许空白:

您可以首先使用以下方法测试提供的范围的有效性:

re.match(r'(\d+(?:-\d+)?(?:(,|\Z)))+$', range_expr)

如果要允许空白:

re.match(r'(\s*\d+(?:\s*-\s*\d+)?(?:(\s*,\s*|\s*\Z)))+$', range_expr)
- and -
for r in re.finditer(r'\s*\d+(?:\s*-\s*\d+)?(?=(\s*,\s*|\s*\Z))', range_expr):

相关问题 更多 >