1import re
 2
 3def parse_wishlist(wishlist):
 4    theWorst = r"\((\d+\.\d+)\)\s+(.+?)\s+\[(\d+).*?\](.*(?:\n\s*[-*].*)*)"
 5    matches = re.findall(theWorst, wishlist, re.MULTILINE)
 6    result = []
 7    for match in matches:
 8        coefficient = float(match[0])
 9        name = match[1].strip()
10        age = int(match[2])
11        wishes = tuple(re.sub(r"^\s*[-*]\s*", "", wish) for wish in match[3].split("\n") if wish.strip() and not wish.strip() in ("-", "*"))
12        result.append((coefficient, name, age, wishes))
13    return result
F..
======================================================================
FAIL: test_full (test.TestRegex)
A single test to rule them all.
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/tmp/test.py", line 121, in test_full
    self.assertEqual(converted, parse_wishlist(modified_example))
AssertionError: Lists differ: [('3.14', 'Иван Иванов', '10', ('Плейстейша[110 chars]',))] != [(3.14, 'Иван Иванов', 10, ('Плейстейшан', [102 chars]',))]
First differing element 0:
('3.14', 'Иван Иванов', '10', ('Плейстейша[34 chars]че'))
(3.14, 'Иван Иванов', 10, ('Плейстейшан', [30 chars]че'))
- [('3.14',
-   'Иван Иванов',
-   '10',
-   ('Плейстейшан', 'Количка с дистанционо', 'Братче')),
? ^
+ [(3.14, 'Иван Иванов', 10, ('Плейстейшан', 'Количка с дистанционо', 'Братче')),
? ^^^^^^^^^^^^^^^^^^^^^^^^^^
-  ('1.94', 'Georgi "Jorkata" Georgiev', '43', ('Vancheto ot tretiq etaj',))]
?   -    -                               -  -
+ (1.94, 'Georgi "Jorkata" Georgiev', 43, ('Vancheto ot tretiq etaj',))]
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
  File "/tmp/test.py", line 123, in test_full
    self.assertEqual(expected_full, parse_wishlist(full))
AssertionError: Lists differ: [(3.1[142 chars])), (6.9, 'Mr. D-r', 999, ('[Doctor stuff] Ска[336 chars]м'))] != [(3.1[142 chars])), (99.9534412345, 'На мама сладкото ангелче'[118 chars]м'))]
First differing element 2:
(6.9, 'Mr. D-r', 999, ('[Doctor stuff] Ска[72 chars]пе'))
(99.9534412345, 'На мама сладкото ангелче'[117 chars]рм'))
First list contains 2 additional elements.
First extra element 3:
(1, 'Gospodin (he/him) Mitko', 12, ('1', '2', '3', '4', 'Malko mi pisva da go pisha toq test'))
  [(3.14, 'Иван Иванов', 10, ('Плейстейшан', 'Количка с дистанционо', 'Братче')),
   (1.94, 'Georgi "Jorkata" Georgiev', 43, ('Vancheto ot tretiq etaj',)),
-  (6.9,
-   'Mr. D-r',
-   999,
-   ('[Doctor stuff] Скалпел',
-    '[Doctor stuff] Мехлем за дупе',
-    '[Non-doctor stuff] Мехлем за дупе')),
-  (1,
-   'Gospodin (he/him) Mitko',
-   12,
-   ('1', '2', '3', '4', 'Malko mi pisva da go pisha toq test')),
   (99.9534412345,
    'На мама сладкото ангелче',
    3,
    ('Най-хубавото дървено конче (размер 1.5)',
     'Най-страхотното лего (тамън отвориха лицензиран магазин)',
     'Хлороформ'))]
----------------------------------------------------------------------
Ran 3 tests in 0.003s
FAILED (failures=1)
                            
    
 
    
        Виктор Бечев
         
    27.12.2023 12:20Щях да ти дам бонус точка, но ако Жорката види, че съм дал звездичка на решение с camelCase, съм уволнен. Освен това и аз нямам желание да поощрявам camelCase, дори и на празниците. :grin: 
                            
                            
                         |