Як написати та регулярний вираз, щоб отримати список із рядка, як, наприклад, якщо у нас є рядок:
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 для відповіді № 1import 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("-")))
Немає необхідності в регулярному вираженні