Python 重新从字符串中标识范围

Python 重新从字符串中标识范围,python,regex,list,parsing,Python,Regex,List,Parsing,如何编写正则表达式以从字符串中获取列表,就像我们有字符串一样: value = '88-94' value = '88 to 94' value = '88' value = '88-94, 96-108' 结果应该是: [88, 89, 90, 91, 92, 93, 94] [88, 89, 90, 91, 92, 93, 94] [88] [88, 89, 90, 91, 92, 93, 94, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105,

如何编写正则表达式以从字符串中获取列表,就像我们有字符串一样:

value = '88-94'
value = '88 to 94'
value = '88'
value = '88-94, 96-108'
结果应该是:

[88, 89, 90, 91, 92, 93, 94]
[88, 89, 90, 91, 92, 93, 94]
[88]
[88, 89, 90, 91, 92, 93, 94, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108]
编程语言是python2.7

这里是python2.7和regex的工作解决方案,但必须检查最后一个案例是否有单个值作为单独的案例:

>>> import regex
>>> m = regex.match(r"(?:(?P<digits>\d+).(?P<digits>\d+))", "88-94")
>>> a = m.captures("digits")
>>> a
['88', '94']
>>> m = regex.match(r"(?:(?P<digits>\d+).(?P<digits>\d+))", "88 94")
>>> a = m.captures("digits")
>>> a
['88', '94']
>>> range(int(a[0]), int(a[1])+1)
[88, 89, 90, 91, 92, 93, 94]
>>> 
几乎涵盖所有情况的解决方案:

>>> import re
>>> a = map(int, re.findall(r'\d+', '88-94, 96-108'))
>>> c = zip(a[::2], a[1::2])
>>> [m for k in [range(i,j+1) for i, j in c] for m in k]
[88, 89, 90, 91, 92, 93, 94, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108]
>>> a = map(int, re.findall(r'\d+', '88-94, 96-108, 125 129'))
>>> c = zip(a[::2], a[1::2])
>>> [m for k in [range(i,j+1) for i, j in c] for m in k]
[88, 89, 90, 91, 92, 93, 94, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 125, 126, 127, 128, 129]
>>> a = map(int, re.findall(r'\d+', '88-94, 96-108, 125 129, 132 to 136'))
>>> c = zip(a[::2], a[1::2])
>>> [m for k in [range(i,j+1) for i, j in c] for m in k]
[88, 89, 90, 91, 92, 93, 94, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 125, 126, 127, 128, 129, 132, 133, 134, 135, 136]
>>> 
有人能提出否决投票或投票反对的理由吗

任何帮助都将不胜感激,有人能建议如何更新问题吗?我不是在寻求替代解决方案,因为我知道如何拆分和循环,甚至可以将re拆分为条带数字并循环,我的问题是,如果可能,如何在单个语句中使用re?答案可以是“否”,但不能是离题的问题

range(*map(int,mystring.split("-")))
不需要正则表达式

import re

def get_numbers(value):
    value = re.sub(r'^(\d+)$', r'\1-\1', value) # '88' -> '88-88'
    start, stop = map(int, re.findall(r'\d+', value))
    return range(start, stop+1)

print get_numbers('88-94')
print get_numbers('88 to 94')
print get_numbers('88')
输出:

[88, 89, 90, 91, 92, 93, 94]
[88, 89, 90, 91, 92, 93, 94]
[88]

int
丢失:
range(*map(int,mystring.split(“-”)
。当
mystring='10'
时,它将生成
[0,1,2,3,4,5,6,7,8,9]
我无意中删除了我的注释,但当有多个
-
时,这不会失败,如“3-4-5-6-7”@SteveP。这是一个有效范围吗?OP想从字符串中标识范围。@thefourtheye否,但它是一个有效的字符串…假设两个输入数字字符串正确,则此操作有效,但其他操作均失败。
start,stop=map(int,re.findall(r'\d+',re.sub(r'^(\d+$),r'\1-\1',value));打印范围(开始、停止+1)
(2条语句)为什么要作为一条语句执行?以清晰易懂且对你有意义的方式进行操作。我正在寻找gru关于如何使用RE来处理尽可能多的情况的好的输入。我的目的是了解我们是否可以使用python RE或regex库生成系列。
[88, 89, 90, 91, 92, 93, 94]
[88, 89, 90, 91, 92, 93, 94]
[88]