Найти - Пользователи
Полная версия: Задача по регуляркам
Начало » Python для новичков » Задача по регуляркам
1
AndrewP
Всем хорошего дня! Я совсем новичок в 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:
AD0DE412
особо не вникая в вашу задачу сразу скажу что for у вас не правильный
AndrewP
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
А как это дальше считать - без понятия.
py.user.next
Почисти данные от лишних символов, добавь недостающие символы.

AndrewP
a = +1
a = 1

AndrewP
b += +10
b = b + 10

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

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

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

Ни количество строк кода, ни скорость выполнения не являются критериями. Потому что говнокод может очень быстро выполняться и мало строк иметь, но при поломке, при вылезании какого-то бага ты его замучаешься чинить и при этом код вообще перестанет работать, пока его не починишь. Его скорость и количество строк тебе никак в этом не помогут. Поможет только ясность кода и хорошая модульность, благодаря которой можно легко вытащить большой кусок программы, переделать его полностью и вставить обратно, как будто ничего и не было.
AD0DE412
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.+)
AndrewP
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))
xam1816
 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
где вы берете эти задания?,тоже изучаю Python,код выше попробовал решить,не знаю только правильно или нет.По проверке, у меня в коде надо логику править
xam1816
отредактировал код выше,результат подошел
AndrewP
xam1816
отредактировал код выше,результат подошел
Огромное спасибо! Задание с этого курса https://www.coursera.org/learn/python-for-web/
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