Форум сайта python.su
Alex_Kutsanreduce в моем случае - это не стандартная функция reduce, про которую вы прочитали. См. код ниже, я ее переименовал, чтобы вам было легче понять. Что делает sub вам нужно таки попытаться разобраться самому. Если трудности с английским, то найдите русскую книжку по Питону и почитайте. Я вряд ли расскажу лучше, чем в документации.
Я всё пытаюсь разобратся в re.sub и в reduce , но у меня ничего не вышло, хелпы мне непомогают, в них что-то совсем непонятное наисано.
Ну это ладно ещё, просто решение не верно т.к мы делаем функцию без правила экономии скобок( это условие)Во-первых я показал направление мысли, а не давал готового решения. Во вторых если понимать как это работает, то исправить проблем нет. Вот вам тоже самое без экономии скобок:
def is_prop_formula(string):
def reducE(string):
result = re.sub("\(&[A-Z]\)|\([A-Z]>[A-Z]\)|\([A-Z]<[A-Z]\)|\([A-Z]=[A-Z]\)|\([A-Z]_[A-Z]\)|\([A-Z]\)", "X", string)
if result != string:
return reducE(result)
return result
return reducE(string) == "X"
тоесть выражение вида (A=B)>(&C<D)=C=T>Z") будет являтся ошибкой.Любой каприз!
Если исправить:
(((A=B)>((&C)<D))=(C=(T>Z))) вот теперь правильно.
> print is_prop_formula("(A=B)>(&C<D)=C=T>Z")
False
> print is_prop_formula("(((A=B)>((&C)<D))=(C=(T>Z)))")
True
Отредактировано (Март 28, 2010 10:12:51)
Офлайн
Конечно понимаю, сейчас постараюсь разобратся с re.sub
Спасибо
Офлайн
Вам для начала нужно разобраться с re, а re.sub - это уже частности.
Читайте здесь: http://ru.wikipedia.org/wiki/%D0%A0%D0%B5%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%BD%D0%BE%D0%B5_%D0%B2%D1%8B%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5
Офлайн
# 1
class BrokenEgg(Exception):
pass
# 2
class Brain_breacker:
def __init__(self):
# 3
self.test_exp = ""
self.expect_operator = 0
self.braces = 0
# 4
self.operators = ("!", "&", "|", "==", "_")
self.operator_leters = ("!", "&", "|", "=", "_")
self.prefix_operators = ("!")
self.var_begining = ("x", "y")
def is_var(self, i):
# 5
if self.test_exp[i] in ("x", "y"):
return True
return False
def add_var(self, i):
# 6
return i+1
def check_operator_expection(self, i):
# 7
if self.expect_operator:
raise BrokenEgg("Expect operator after '%s'." % self.test_exp[:i])
def check_other_expection(self, i):
# 8
if not self.expect_operator:
if self.test_exp[i] in self.prefix_operators:
return True
raise BrokenEgg("Don't expect operator after '%s'." % self.test_exp[:i])
def is_operator(self, i):
# 9
if self.test_exp[i] in self.operator_leters:
return True
return False
def add_operator(self, i):
# 10
j = i
buf = ""
while self.test_exp[j] in self.operator_leters:
buf += self.test_exp[j]
j += 1
if buf in self.operators:
return j
else:
raise BrokenEgg("Operator '%s' doesn't exist." % buf)
def start(self, expression):
# 11
self.test_exp = expression
i = 0
while i < len(self.test_exp):
# 12
if self.test_exp[i] == "(":
# 13
self.check_operator_expection(i)
# 14
self.braces += 1
# 15
self.expect_operator = False
# 16
i += 1
# 17
continue
# 18
if self.test_exp[i] == ")":
self.braces -= 1
# 19
self.expect_operator = True
i += 1
continue
# 20
if self.is_var(i):
self.check_operator_expection(i)
i = self.add_var(i)
self.expect_operator = True
continue
# 21
if self.is_operator(i):
self.check_other_expection(i)
self.expect_operator = False
i = self.add_operator(i)
continue
# 22
if self.test_exp[i] == " ":
i += 1
continue
# 23
raise BrokenEgg("Unexpectable simbol '%s'." % self.test_exp[i])
# 24
if self.braces:
raise BrokenEgg("Something wrong with braces.")
return True
# 25
def test(text, i = [0]):
# 26
i[0] += 1
print ">Test number %s:" % i[0]
print "Test expression is '%s'." % text
# 27
bb = Brain_breacker()
# 28
try:
bb.start(text)
print "It's allright with '%s'" % text
except BrokenEgg as e:
print e
print ""
# 29
test("(!x == y & x ! x & !(!x & !y))")
test("(!x + y & x ! x & !(!x & !y))")
test("(!x == y & x = x & !(!x & !y))")
test("(!x == (y) & (x ! x & !(!x & !y)))")
test("(!x == (y & (x ! x & !(!x & !y)))")
Офлайн
Знаете если чесно я почти понял что это re.sub("\(&\)|\(>\)|\(<\)|\(=\)|\(_\)|\(\)“, ”X", string)
Я сейчас буду говорить, а вы поправьте неправильные мои соображения
1.И так переменные у нас могут быть с A по Z
2.утверждения чего можо разделяются таким образом |
3.вы определили все знаки что они должны быть между переменными, и отрицание только с 1 переменной
4.вы раставили скобки по обоим частям со стороны переменных, и отдельно с опрератором НЕ
5. Вы гений
А теперь вопросы
1.я не понял назначение косой черты, я читал тут http://ru.wikipedia.org/wiki/Регулярное_выражение но всёравно не сильно догнал. ОНа както заставляет думать что символ после неё функция?
2.назначение Икса, поидее функция re. будет перебирать “Х” с выражением. Или просто “Х” обозначает выполнение всех поставленых ранее условий?
3.каким образом тут реализовано что вместо А-Z может стоять другая функция?
И теперь по reducE.
почему эта функция выполняется хотя она до этого не задана?
и вобще толком что она делает?
Офлайн
Alex_KutsanДа. “|” переводится как “ИЛИ”.
2.утверждения чего можо разделяются таким образом |
Alex_KutsanОн просто экранирует скобку. Без него скобка является управляющим символом (в языке регулярных выражовываний)
1.я не понял назначение косой черты, я читал тут http://ru.wikipedia.org/wiki/Регулярное_выражение но всёравно не сильно догнал. ОНа както заставляет думать что символ после неё функция?
Alex_KutsanКак это не задана?
И теперь по reducE.
почему эта функция выполняется хотя она до этого не задана?
def reducE(string):
Alex_KutsanЭто модификатор. Он позволяет игнорировать пробелы в регулярном выражении.
2.назначение Икса, поидее функция re. будет перебирать “Х” с выражением.
Офлайн
knkdЭто не модификатор, а просто символ, на который заменяется то, что матчится. Он же и переменная в нашем понимании, поскольку входит в диапазон A-Z.Alex_KutsanЭто модификатор. Он позволяет игнорировать пробелы в регулярном выражении.
2.назначение Икса, поидее функция re. будет перебирать “Х” с выражением.
Офлайн
Ага, вроде уже почти всё прояснилось… функция re. невероятно действена, мне она очень понравилась.
Да, и по делу
Тоесть при прохождении функции re.sub он фактически заменяет любую переменную что входить на Х , или в общем случае всё что входит в на Х.Или всётаки ставит в соответствие с Х любую последоваетльность из ранее перечисленых утверждений?
И вот ещё, всётаки , как ему вы обьяснили что вместо любого из можно вставлять справедливые выражения.
вот этим способом?
def reducE(string):
result = re.sub("\(&[A-Z]\)|\([A-Z]>[A-Z]\)|\([A-Z]<[A-Z]\)|\([A-Z]=[A-Z]\)|\([A-Z]_[A-Z]\)|\([A-Z]\)", "X", string)
if result != string:
return reducE(result)
Офлайн
EdОй :)
Это не модификатор, а просто символ, на который заменяется то, что матчится.
Офлайн
А что означает Мачится.В докуменаци оно посто янно используется но не расказывается что это значит.
Если на него заменяется эт ото что мачится то наверно на него заменяется string
но тогда очему не пашет такой код?
>>> def is_prop_formula(string):
def reducE(string):
result = re.sub("\(&[A-z]\)|\([A-z]>[A-z]\)|\([A-z]<[A-z]\)|\([A-z]=[A-z]\)|\([A-z]_[A-z]\)|\([A-z]\)", string)
if result != string:
return reducE(result)
return result
return reducE(string) == string
>>> is_prop_formula("(&d)")
Traceback (most recent call last):
File "<pyshell#47>", line 1, in <module>
is_prop_formula("(&d)")
File "<pyshell#46>", line 7, in is_prop_formula
return reducE(string) == string
File "<pyshell#46>", line 3, in reducE
result = re.sub("\(&[A-z]\)|\([A-z]>[A-z]\)|\([A-z]<[A-z]\)|\([A-z]=[A-z]\)|\([A-z]_[A-z]\)|\([A-z]\)", string)
TypeError: sub() takes at least 3 arguments (2 given)
def is_prop_formula(string):
def reducE(string):
result = re.sub("\(&[A-z]\)|\([A-z]>[A-z]\)|\([A-z]<[A-z]\)|\([A-z]=[A-z]\)|\([A-z]_[A-z]\)|\([A-z]\)",A, string)
if result != string:
return reducE(result)
return result
return reducE(string) == A
>>> is_prop_formula("(&d)")
Traceback (most recent call last):
File "<pyshell#50>", line 1, in <module>
is_prop_formula("(&d)")
File "<pyshell#49>", line 7, in is_prop_formula
return reducE(string) == A
File "<pyshell#49>", line 3, in reducE
result = re.sub("\(&[A-z]\)|\([A-z]>[A-z]\)|\([A-z]<[A-z]\)|\([A-z]=[A-z]\)|\([A-z]_[A-z]\)|\([A-z]\)",A, string)
NameError: global name 'A' is not defined
Офлайн