Уведомления

Группа в Telegram: @pythonsu

#1 Ноя. 29, 2010 13:25:26

baimer
От:
Зарегистрирован: 2010-11-29
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

Регулярные выражения

Доброго времени суток. Почитал доки по регулярным выражениям в питоне, но не все понял.

Мне нужно считать строку, представляющую из себя некий интервал (к примеру, от двух третьих невключительно и до пяти включительно: (2/3;5]) и вывести, сколько целых чисел находится в этом промежутке.
Я пытаюсь извлечь эти числа из строки с помощью регулярного выражения, а потом с помощью range найти, сколько чисел есть в промежутке.
Как прописать в регулярном выражении считывание двух чисел, разделенных “;” с учетом того, что числа могут включаться в промежуток или исключаться из него?



Офлайн

#2 Ноя. 29, 2010 15:08:13

tmt
От:
Зарегистрирован: 2010-03-26
Сообщения: 51
Репутация: +  0  -
Профиль   Отправить e-mail  

Регулярные выражения

В регулярных выражениях нельзя оперировать понятием “от двух третьих невключительно”.
Они направлены на поиск и манипуляцию с подстроками текста, и никакой математики =)
Вам нужно задать шаблон который бы правильно описывал вашу подстроку “от двух третьих невключительно”,
и уже в коде производить математические вычисления. А уже на основании этого делать заключения о
вхождении этого числа в интервал.



Офлайн

#3 Ноя. 29, 2010 16:19:02

o7412369815963
От:
Зарегистрирован: 2009-06-17
Сообщения: 1986
Репутация: +  32  -
Профиль   Отправить e-mail  

Регулярные выражения

давайте исходную строку и что нужно она выходе

Офлайн

#4 Ноя. 29, 2010 16:22:50

KarDer_Groom
От:
Зарегистрирован: 2009-11-17
Сообщения: 59
Репутация: +  0  -
Профиль   Отправить e-mail  

Регулярные выражения

Читай строку питоном, читай первый и последний символ, узнаешь свои вхождения, остальное разбей .split. Разбитые числа ты легко количество их посчитаешь, сумму, да любую математику, и регулярки не потребуются.



Офлайн

#5 Ноя. 29, 2010 17:40:03

baimer
От:
Зарегистрирован: 2010-11-29
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

Регулярные выражения

o7412369815963,
Исходная строка: ответ.
: 1001.
: 5.
[3/2, 3): 1.

tmt, KarDer_Groom,
т.е, регулярные выражения не поддерживают условия в духе «Если — то»? Просто работать со строкой удобнее?

Спасибо.



Офлайн

#6 Ноя. 29, 2010 17:58:16

o7412369815963
От:
Зарегистрирован: 2009-06-17
Сообщения: 1986
Репутация: +  32  -
Профиль   Отправить e-mail  

Регулярные выражения

baimer
o7412369815963,
Исходная строка: ответ.
: 1001.
: 5.
[3/2, 3): 1.

tmt, KarDer_Groom,
т.е, регулярные выражения не поддерживают условия в духе «Если — то»? Просто работать со строкой удобнее?

Спасибо.
типа этого, итог не совпадает, но все необходимые компоненты есть:
>>> s = '[3/2, 3]'
>>> int(reduce(lambda a,b:round(abs(a-b)-0.5),[eval(x+'.0') for x in re.findall(r'([\-0-9/]+)',s)]))
1
а вообще если не включительно, то результаты должны быть такие:
: 999 # -499..0..499
: 4. # -2 -1 0 1
[3/2, 3): 1. # 2

Офлайн

#7 Ноя. 29, 2010 18:09:38

baimer
От:
Зарегистрирован: 2010-11-29
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

Регулярные выражения

o7412369815963
а вообще если не включительно, то результаты должны быть такие:
: 999 # -499..0..499
: 4. # -2 -1 0 1
[3/2, 3): 1. # 2
Знак ‘[’ показывает, что число берется в промежуток, а ‘(’ — что не берется. Аналогично для второго.

Спасибо, буду разбирать Ваш код.



Офлайн

#8 Ноя. 29, 2010 18:36:51

o7412369815963
От:
Зарегистрирован: 2009-06-17
Сообщения: 1986
Репутация: +  32  -
Профиль   Отправить e-mail  

Регулярные выражения

ясно, тогда от регепсов смысла мало, вот набросал “влоб”:

def foo(s):
r = [eval(x+'.0') for x in s[1:-1].split(', ')]
z = int(round(abs(r[0]-r[1])+1 - (1 if s[0] == '(' else 0) - (1 if s[-1] == ')' else 0) - 0.5))
print z

foo('[-500, 500]')
foo('[-3, 4/3]')
foo('[3/2, 3)')
результат:
1001
5
1

Офлайн

#9 Ноя. 30, 2010 09:06:46

KarDer_Groom
От:
Зарегистрирован: 2009-11-17
Сообщения: 59
Репутация: +  0  -
Профиль   Отправить e-mail  

Регулярные выражения

o7412369815963
:) в итоге победил мой способ :)
Одной строкой нифига не наглядно, но красиво. И для себя на заметку возьму.



Офлайн

#10 Ноя. 30, 2010 15:24:12

Subideal Ox
От:
Зарегистрирован: 2010-11-23
Сообщения: 65
Репутация: +  0  -
Профиль   Отправить e-mail  

Регулярные выражения

o7412369815963
def foo(s):
r = [eval(x+'.0') for x in s[1:-1].split(', ')]
z = int(round(abs(r[0]-r[1])+1 - (1 if s[0] == '(' else 0) - (1 if s[-1] == ')' else 0) - 0.5))
print z

foo('[-500, 500]')
foo('[-3, 4/3]')
foo('[3/2, 3)')
 map(foo, [ '(1, 1]', '[1, 1)', '(1, 1)'])
;)



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version