Уведомления

Группа в Telegram: @pythonsu

#1 Май 10, 2020 12:18:11

AndrewP
Зарегистрирован: 2020-04-16
Сообщения: 7
Репутация: +  1  -
Профиль   Отправить e-mail  

Задача по регуляркам

Всем хорошего дня! Я совсем новичок в python, прошу помочь с заданием по регулярным выражениям.
ЗАДАНИЕ:
Нужно написать программу, которая найдет в тексте ряд простых арифметических выражений и подсчитает их.

     
text = """
    a=1
    a=+1
    a=-1
    a=b
    a=b+100
    a=b-100
    
    b+=10
    b+=+10
    b+=-10
    b+=b
    b+=b+100
    b+=b-100
    
    c-=101
    c-=+101
    c-=-101
    c-=b
    c-=b+101
    c-=b-101

В вашу функцию calculate(data, findall) будет передан словарь с начальными значениями переменных a, b и c: data = {“a”:1, “b”:2, “c”: 3} и ссылка на функцию findall, а вы должны вернуть такой же словарь с новыми значениями для a, b и c.

Эталонное решение занимает 11 строк, не содержит импортов, не использует eval, а регулярное выражение находит выражения и бьет каждое на четыре группы (некоторые группы для некоторых выражений оказываются пустыми):

Имя переменной слева.
Знак перед = (если есть).
Имя переменной справа (если есть).
Число (если есть) со знаком (если есть).

Это позволяет легко (буквально в одну строку) посчитать правую часть, а потом, в зависимости от наличия знака перед =, произвести действие с левой частью. Однако ваш алгоритм может быть другим, требуется только выполнить ограничения на вызов findall() и оставить сигнатуру calculate() неизменной.

Я написал регулярку, а как посчитать - без понятия.
 def calculate(data, findall):
    matches = findall(r"([abc])([+-]?=)([abc])?([+-]?\d+)?")
    for v1, s, v2, n in matches:

Офлайн

#2 Май 10, 2020 21:25:14

AD0DE412
Зарегистрирован: 2019-05-12
Сообщения: 1130
Репутация: +  44  -
Профиль   Отправить e-mail  

Задача по регуляркам

особо не вникая в вашу задачу сразу скажу что for у вас не правильный



1. пжлст, форматируйте код, это в панели создания сообщений, выделите код и нажмите что то вроде
2. чтобы вставить изображение залейте его куда нибудь (например), нажмите и вставьте ссылку на его url

есчщо

Офлайн

#3 Май 11, 2020 15:05:05

AndrewP
Зарегистрирован: 2020-04-16
Сообщения: 7
Репутация: +  1  -
Профиль   Отправить e-mail  

Задача по регуляркам

AD0DE412
особо не вникая в вашу задачу сразу скажу что for у вас не правильный
For был написан составителем задания, так что полагаю что все же правильный. К тому же требуется написать функцию именно по такому шаблону. Регулярное выражение делит уравнения на 4 блока, если сделать
 print (v1,s,v2,n)
выдает
 a =  1
a =  +1
a =  -1
a = b 
a = b +100
a = b -100
b +=  10
b +=  +10
b +=  -10
b += b 
b += b +100
b += b -100
c -=  101
c -=  +101
c -=  -101
c -= b 
c -= b +101
c -= b -101
А как это дальше считать - без понятия.

Отредактировано AndrewP (Май 11, 2020 15:09:17)

Офлайн

#4 Май 11, 2020 16:14:18

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10024
Репутация: +  857  -
Профиль   Отправить e-mail  

Задача по регуляркам

Почисти данные от лишних символов, добавь недостающие символы.

AndrewP
a = +1
a = 1

AndrewP
b += +10
b = b + 10

Когда у тебя есть приготовленные данные, очищенные от мусора и приведённые к более формальному виду, тогда и обрабатываешь их простым регулярным выражением.

AndrewP
Эталонное решение занимает 11 строк, не содержит импортов
Странно, что его функция принимает findall() но не принимает паттерн для findall(). Так что не обращай внимание на его критерии эталонности.

Критерии качественной программы в программировании известны: программа должна быть правильной, понятной и легко меняемой.

Ни количество строк кода, ни скорость выполнения не являются критериями. Потому что говнокод может очень быстро выполняться и мало строк иметь, но при поломке, при вылезании какого-то бага ты его замучаешься чинить и при этом код вообще перестанет работать, пока его не починишь. Его скорость и количество строк тебе никак в этом не помогут. Поможет только ясность кода и хорошая модульность, благодаря которой можно легко вытащить большой кусок программы, переделать его полностью и вставить обратно, как будто ничего и не было.



Отредактировано py.user.next (Май 11, 2020 16:17:11)

Офлайн

#5 Май 11, 2020 19:49:10

AD0DE412
Зарегистрирован: 2019-05-12
Сообщения: 1130
Репутация: +  44  -
Профиль   Отправить e-mail  

Задача по регуляркам

AndrewP
полагаю что все же правильный
да пожалуй
что то вроде
 a = [[1, 2, 3],[4, 5, 6],[7, 8, 9]]
for q, w, e in a:
    print(q, w, e)

 1 2 3
4 5 6
7 8 9

сорян мне такое не было известно (ну если вернее то было но не в фокусе) … типа распаковка … спасиб

ps вроде так (в python не проверялось в редакторе регулярок вроде работает)

 Имя переменной слева. ([a-z].+)
Знак перед = (если есть). ([a-z][+|-]=.+)
Имя переменной справа (если есть). (([a-z][+|-]=[a-z].+)|([a-z]=[a-z].+))
Число (если есть) со знаком (если есть). (.*[+|-]\d.+)



1. пжлст, форматируйте код, это в панели создания сообщений, выделите код и нажмите что то вроде
2. чтобы вставить изображение залейте его куда нибудь (например), нажмите и вставьте ссылку на его url

есчщо

Отредактировано AD0DE412 (Май 11, 2020 20:48:14)

Офлайн

#6 Май 13, 2020 12:28:03

AndrewP
Зарегистрирован: 2020-04-16
Сообщения: 7
Репутация: +  1  -
Профиль   Отправить e-mail  

Задача по регуляркам

py.user.next
Почисти данные от лишних символов, добавь недостающие символы.
Спасибо за ответ, но я забыл указать,что задание проверяется другим файлом, там и задан findall

 import re
from regexp import calculate
def findall(regexp):
    text = """
    a=1
    a=+1
    a=-1
    a=b
    a=b+100
    a=b-100
    
    b+=10
    b+=+10
    b+=-10
    b+=b
    b+=b+100
    b+=b-100
    
    c-=101
    c-=+101
    c-=-101
    c-=b
    c-=b+101
    c-=b-101
    """
    return re.findall(regexp, text)
result = calculate({'a': 1, 'b': 2, 'c': 3}, findall)
correct = {"a": -98, "b": 196, "c": -686}
if result == correct:
    print ("Correct")
else:
    print ("Incorrect: %s != %s" % (result, correct))

Офлайн

#7 Май 13, 2020 13:15:01

xam1816
Зарегистрирован: 2020-05-11
Сообщения: 1395
Репутация: +  124  -
Профиль   Отправить e-mail  

Задача по регуляркам

 import re
text = """
 a=+1
    a=-1
    a=b
    a=b+100
    a=b-100
    
    b+=10
    b+=+10
    b+=-10
    b+=b
    b+=b+100
    b+=b-100
    
    c-=101
    c-=+101
    c-=-101
    c-=b
    c-=b+101
    c-=b-101
		"""
data = {"a":1, "b":2, "c": 3}
def calculate(data):
	matches = re.findall(r"([abc])([+-]?=)([abc])?([+-]?\d+)?",text)
	for v1, s, v2, n in matches:
		if n == "":
			n = 0
		if s =="="and v2 =="":
			data[v1] = int(n)
		elif s=="="and v2 !="":
			data[v1]=data[v2]+int(n)
			print("eee")
		elif s == "+="and v2 =="":
			data[v1]+=int(n)
		elif s =="+=" and v2 !="":
			data[v1] += data[v2] + int(n)
		elif s == "-="and v2 =="":
			data[v1]-=int(n)
		elif s =="-=" and v2 !="":
			data[v1] -= data[v2] + int(n)
calculate(data)
print(data)

Отредактировано xam1816 (Май 13, 2020 22:41:46)

Офлайн

#8 Май 13, 2020 13:17:52

xam1816
Зарегистрирован: 2020-05-11
Сообщения: 1395
Репутация: +  124  -
Профиль   Отправить e-mail  

Задача по регуляркам

где вы берете эти задания?,тоже изучаю Python,код выше попробовал решить,не знаю только правильно или нет.По проверке, у меня в коде надо логику править

Отредактировано xam1816 (Май 13, 2020 13:21:32)

Офлайн

#9 Май 13, 2020 22:47:45

xam1816
Зарегистрирован: 2020-05-11
Сообщения: 1395
Репутация: +  124  -
Профиль   Отправить e-mail  

Задача по регуляркам

отредактировал код выше,результат подошел

Офлайн

#10 Май 14, 2020 08:09:44

AndrewP
Зарегистрирован: 2020-04-16
Сообщения: 7
Репутация: +  1  -
Профиль   Отправить e-mail  

Задача по регуляркам

xam1816
отредактировал код выше,результат подошел
Огромное спасибо! Задание с этого курса https://www.coursera.org/learn/python-for-web/

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version