NP, fakt si to podchyt tim testem, ala (hodne z rychliku):
starenka@kosmik1:/junk$ cat meh.py
#!/usr/bin/env python3.2
# -*- coding: utf-8 -*-
import re
import unittest
pattern = re.compile(r'''
^ # začiatok reťazcu
\( # číselné vyjadrenie je v zátvorke
( # nasledujúci blok zachytávame - jednotlivé vyjadrenie čísla
( # zachytávame číslo, ktoré násobí vyjadrenie
[-+]? # predpokladáme, že prvý znak bude znamienko, ale nemusí byť
\d* # ľubovolný číselný výraz, ktorý "násobí" hodnotu výrazu
)? # nevyžadujeme ho povinne - násobenie
( # zachytávame jednotlivé premenné
([a-z]) # nejaké alfabetické vyjadrenie výrazu (písmeno), ktorý zachytávame
(?:^|(\*\*)) # ľubovolný "umocňovateľ"
(\d*) # mocniteľ
)+ # je striktne vyžadovaný
) # blok je u konca
{2} # vyžadujeme ho dvakrát
\) # koniec číselného vyjadrenia
(?:^|(\*\*)) # mocniteľ...
(\d+) # ľubovolná mocnina zátvorky
$ # koniec reťazcu
''', re.VERBOSE)
class ReTest(unittest.TestCase):
VALID_EXPRS = ['(x^2+5y)^2','(1*x+2y)**4']
NOT_VALID_EXPRS = ['(1*x+2y)*4','(a+b)^2']
def test_ok(self):
for expr in self.VALID_EXPRS:
print(expr)
self.assertEqual(True,bool(re.search(pattern,expr)))
def test_bad(self):
for expr in self.NOT_VALID_EXPRS:
print(expr)
self.assertEqual(False,bool(re.search(pattern,expr)))
if __name__ == '__main__':
unittest.main()
starenka@kosmik1:/junk$ python meh.py
(1*x+2y)*4
(a+b)^2
.(x^2+5y)^2
F
======================================================================
FAIL: test_ok (__main__.ReTest)
----------------------------------------------------------------------
Traceback (most recent call last):
File "meh.py", line 39, in test_ok
self.assertEqual(True,bool(re.search(pattern,expr)))
AssertionError: True != False
----------------------------------------------------------------------
Ran 2 tests in 0.000s
FAILED (failures=1)