/ / re, щоб визначити діапазон від рядка - python, regex, list, синтаксичний аналіз

повторно визначити діапазон від рядка - 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, 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]
>>>

Ось рішення, яке стосується вищезазначених випадків, але що стосується 88-94, 96-98 тощо

>>> import re
>>> a = map(int, re.findall(r"d+", "88-94"))
>>> range(a[0], a[-1]+1)
[88, 89, 90, 91, 92, 93, 94]
>>> a = map(int, re.findall(r"d+", "88 94"))
>>> range(a[0], a[-1]+1)
[88, 89, 90, 91, 92, 93, 94]
>>> a = map(int, re.findall(r"d+", "88"))
>>> range(a[0], a[-1]+1)
[88]
>>>

Рішення, яке охоплює майже всі випадки:

>>> 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]
>>>

Чи може хтось запропонувати причину, щоб зняти чи проголосувати за закриття?

Будь-яка допомога буде вдячна і може коженпідкажіть, як оновити питання, я не прошу альтернативних рішень, оскільки я знаю, як розділити і циклічно повторити смуги цифр і циклу, моє питання полягає в тому, як це зробити з повторним записом, якщо це можливо? Відповідь не може бути жодним запитанням як поза темою.

Відповіді:

1 для відповіді № 1
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]

1 для відповіді № 2
range(*map(int,mystring.split("-")))

Немає необхідності в регулярному вираженні