Найти - Пользователи
Полная версия: Регулярные выражения
Начало » Python для новичков » Регулярные выражения
1
baimer
Доброго времени суток. Почитал доки по регулярным выражениям в питоне, но не все понял.

Мне нужно считать строку, представляющую из себя некий интервал (к примеру, от двух третьих невключительно и до пяти включительно: (2/3;5]) и вывести, сколько целых чисел находится в этом промежутке.
Я пытаюсь извлечь эти числа из строки с помощью регулярного выражения, а потом с помощью range найти, сколько чисел есть в промежутке.
Как прописать в регулярном выражении считывание двух чисел, разделенных “;” с учетом того, что числа могут включаться в промежуток или исключаться из него?
tmt
В регулярных выражениях нельзя оперировать понятием “от двух третьих невключительно”.
Они направлены на поиск и манипуляцию с подстроками текста, и никакой математики =)
Вам нужно задать шаблон который бы правильно описывал вашу подстроку “от двух третьих невключительно”,
и уже в коде производить математические вычисления. А уже на основании этого делать заключения о
вхождении этого числа в интервал.
o7412369815963
давайте исходную строку и что нужно она выходе
KarDer_Groom
Читай строку питоном, читай первый и последний символ, узнаешь свои вхождения, остальное разбей .split. Разбитые числа ты легко количество их посчитаешь, сумму, да любую математику, и регулярки не потребуются.
baimer
o7412369815963,
Исходная строка: ответ.
: 1001.
: 5.
[3/2, 3): 1.

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

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

Спасибо, буду разбирать Ваш код.
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)')
результат:
1001
5
1
KarDer_Groom
o7412369815963
:) в итоге победил мой способ :)
Одной строкой нифига не наглядно, но красиво. И для себя на заметку возьму.
Subideal Ox
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)'])
;)
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB