Предизвикателства > Регекс за Дядо Коледа > Решения > Решението на Атанас Христов

Резултати
0 точки от тестове
0 точки от учител

0 точки общо

0 успешни теста
3 неуспешни теста
Код (Първи опит с regex.)

 1import re
 2
 3def parse_wishlist(input_string):
 4    pattern = r'((.?))\s(.?)\s[(.?)]\s([\s\S]?)(?=([\d.])|$)'
 5    matches = re.findall(pattern, input_string)
 6
 7    result = []
 8    for match in matches:
 9        coefficient = float(match[0])
10        name = match[1].strip()
11        age_match = re.search(r'(\d+)\s', match[2])
12        age = int(age_match.group(1)) if age_match else None
13
14        wishes = re.findall(r'[-][\s[^\n]]*(.+?)(?=\n|$)', match[3]) # absolutely no idea why [\s[^\n]]* works, but \s* does not
15        result.append((coefficient, name, age, tuple(wishes)))
16
17    return result

EFF
======================================================================
ERROR: 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', ('Плейстейш[111 chars]',))] != []

First list contains 2 additional elements.
First extra element 0:
('3.14', 'Иван Иванов', '10', ('Плейстейшан', 'Количка с дистанционо', 'Братче'))

+ []
- [('3.14',
- 'Иван Иванов',
- '10',
- ('Плейстейшан', 'Количка с дистанционо', 'Братче')),
- ('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))
File "/tmp/solution.py", line 9, in parse_wishlist
coefficient = float(match[0])
ValueError: could not convert string to float: 'j'

======================================================================
FAIL: test_half (test.TestRegex)
A test without the more edgy cases.
----------------------------------------------------------------------
Traceback (most recent call last):
File "/tmp/test.py", line 111, in test_half
self.assertEqual(converted, parse_wishlist(modified_example))
AssertionError: Lists differ: [('3.14', 'Иван Иванов', '10', ('Плейстейш[111 chars]',))] != []

First list contains 2 additional elements.
First extra element 0:
('3.14', 'Иван Иванов', '10', ('Плейстейшан', 'Количка с дистанционо', 'Братче'))

+ []
- [('3.14',
- 'Иван Иванов',
- '10',
- ('Плейстейшан', 'Количка с дистанционо', 'Братче')),
- ('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 113, in test_half
self.assertEqual(expected_half, parse_wishlist(half))
AssertionError: Lists differ: [(3.14, 'Иван Иванов', 10, ('Плейстейшан',[269 chars]м'))] != []

First list contains 3 additional elements.
First extra element 0:
(3.14, 'Иван Иванов', 10, ('Плейстейшан', 'Количка с дистанционо', 'Братче'))

+ []
- [(3.14, 'Иван Иванов', 10, ('Плейстейшан', 'Количка с дистанционо', 'Братче')),
- (1.94, 'Georgi "Jorkata" Georgiev', 43, ('Vancheto ot tretiq etaj',)),
- (99.9534412345,
- 'На мама сладкото ангелче',
- 3,
- ('Най-хубавото дървено конче (размер 1.5)',
- 'Най-страхотното лего (тамън отвориха лицензиран магазин)',
- 'Хлороформ'))]

======================================================================
FAIL: test_modified_example (test.TestRegex)
A test similar to the example (just a lil' bit different).
----------------------------------------------------------------------
Traceback (most recent call last):
File "/tmp/test.py", line 101, in test_modified_example
self.assertEqual(converted, parse_wishlist(modified_example))
AssertionError: Lists differ: [('3.14', 'Иван Иванов', '10', ('Плейстейш[111 chars]',))] != []

First list contains 2 additional elements.
First extra element 0:
('3.14', 'Иван Иванов', '10', ('Плейстейшан', 'Количка с дистанционо', 'Братче'))

+ []
- [('3.14',
- 'Иван Иванов',
- '10',
- ('Плейстейшан', 'Количка с дистанционо', 'Братче')),
- ('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 103, in test_modified_example
self.assertEqual(expected_example, parse_wishlist(modified_example))
AssertionError: Lists differ: [(3.14, 'Иван Иванов', 10, ('Плейстейшан',[103 chars]',))] != []

First list contains 2 additional elements.
First extra element 0:
(3.14, 'Иван Иванов', 10, ('Плейстейшан', 'Количка с дистанционо', 'Братче'))

+ []
- [(3.14, 'Иван Иванов', 10, ('Плейстейшан', 'Количка с дистанционо', 'Братче')),
- (1.94, 'Georgi "Jorkata" Georgiev', 43, ('Vancheto ot tretiq etaj',))]

----------------------------------------------------------------------
Ran 3 tests in 0.001s

FAILED (failures=2, errors=1)

Дискусия
Атанас Христов
27.12.2023 14:53

А това дето викаш че не работи даже с примера е странно, помня че го тествах и работеше преди да го кача. 🤔
Атанас Христов
27.12.2023 14:46

Хах ами дискретните не са ми сила ама изобщо и учих regex-и от вашата презентация за точно един цял ден. Та няма какво да се очаква XD. То и сега съм на ски и не мога да го видя да го оправя. Като се върна в софия ще го погледна защо не работи.
Виктор Бечев
27.12.2023 13:07

Много ми се иска и на теб да дам бонус точка, но на другите с фейлващи тестове им липсва някоя скоба, някой интервал. При теб прекарах 10-тина минути да фиксвам _(не да го пренаписвам, това убива смисъла в упражнението)_ и пак е трудно да се доближа до коректен match. Некст гейм е некст гейм, дет' вика Ицата...
Виктор Бечев
27.12.2023 11:51

То даже с примера не работи, буквално всеки път връща празен списък. ;(
Атанас Христов
23.12.2023 00:48

Утре ще се опитам да го докарам до one liner :^)
История

tt1import re
2 
1def parse_wishlist(wishlist):3def parse_wishlist(input_string):
2    wishlist += '\n\n'4    pattern = r'((.?))\s(.?)\s[(.?)]\s([\s\S]?)(?=([\d.])|$)'
3    xd = []5    matches = re.findall(pattern, input_string)
4    coefBool = False6 
5    nameBool = False7    result = []
6    ageBool = False8    for match in matches:
7    wishesBool = False9        coefficient = float(match[0])
8    foundWish = False10        name = match[1].strip()
9    coef = ''11        age_match = re.search(r'(\d+)\s', match[2])
10    name = ''12        age = int(age_match.group(1)) if age_match else None
11    age = ''13 
12    wish = ''14        wishes = re.findall(r'[-][\s[^\n]]*(.+?)(?=\n|$)', match[3]) # absolutely no idea why [\s[^\n]]* works, but \s* does not
13    wishes = []15        result.append((coefficient, name, age, tuple(wishes)))
14    counter = 016 
15    char_count = len(wishlist)17    return result
16    for char in wishlist:
17        counter += 1
18        if (char == '(' and not foundWish) or counter == char_count:
19            if coef != '':
20                xd.append(tuple([float(coef), str(name.strip()), int(age), tuple(str(w.strip()) for w in wishes)]))
21            wishesBool = False
22            coefBool = True
23            coef = ''
24        elif wishesBool:
25            if char == '\n':
26                if wish and not wish.isspace():
27                    wishes.append(str(wish))
28                    wish = ''
29                foundWish = False
30            elif char in '-*' and not foundWish:
31                foundWish = True
32                wish = ''
33            elif foundWish:
34                wish += char
35        elif char == ')':
36            coefBool = False
37            nameBool = True
38            name = ''
39            coef = float(coef)
40        elif coefBool:
41            coef += char
42        elif char == '[':
43            nameBool = False
44            ageBool = True
45            age = ''
46        elif nameBool:
47            name += char
48        elif char == ']':
49            ageBool = False
50            pure_age = ''
51            age = int(pure_age.join([x for x in age if x in '0123456789']))
52        elif ageBool:
53            age += char
54        elif char == '\n':
55            wishesBool = True
56            wishes = []
57    return list(xd)
Legends
Colors
 Added 
Changed
Deleted
Links
(f)irst change
(n)ext change
(t)op

t1def parse_wishlists(wishlist):t1def parse_wishlist(wishlist):
2    wishlist += '\n\n'2    wishlist += '\n\n'
3    xd = []3    xd = []
4    coefBool = False4    coefBool = False
5    nameBool = False5    nameBool = False
6    ageBool = False6    ageBool = False
7    wishesBool = False7    wishesBool = False
8    foundWish = False8    foundWish = False
9    coef = ''9    coef = ''
10    name = ''10    name = ''
11    age = ''11    age = ''
12    wish = ''12    wish = ''
13    wishes = []13    wishes = []
14    counter = 014    counter = 0
15    char_count = len(wishlist)15    char_count = len(wishlist)
16    for char in wishlist:16    for char in wishlist:
17        counter += 117        counter += 1
18        if (char == '(' and not foundWish) or counter == char_count:18        if (char == '(' and not foundWish) or counter == char_count:
19            if coef != '':19            if coef != '':
20                xd.append(tuple([float(coef), str(name.strip()), int(age), tuple(str(w.strip()) for w in wishes)]))20                xd.append(tuple([float(coef), str(name.strip()), int(age), tuple(str(w.strip()) for w in wishes)]))
21            wishesBool = False21            wishesBool = False
22            coefBool = True22            coefBool = True
23            coef = ''23            coef = ''
24        elif wishesBool:24        elif wishesBool:
25            if char == '\n':25            if char == '\n':
26                if wish and not wish.isspace():26                if wish and not wish.isspace():
27                    wishes.append(str(wish))27                    wishes.append(str(wish))
28                    wish = ''28                    wish = ''
29                foundWish = False29                foundWish = False
30            elif char in '-*' and not foundWish:30            elif char in '-*' and not foundWish:
31                foundWish = True31                foundWish = True
32                wish = ''32                wish = ''
33            elif foundWish:33            elif foundWish:
34                wish += char34                wish += char
35        elif char == ')':35        elif char == ')':
36            coefBool = False36            coefBool = False
37            nameBool = True37            nameBool = True
38            name = ''38            name = ''
39            coef = float(coef)39            coef = float(coef)
40        elif coefBool:40        elif coefBool:
41            coef += char41            coef += char
42        elif char == '[':42        elif char == '[':
43            nameBool = False43            nameBool = False
44            ageBool = True44            ageBool = True
45            age = ''45            age = ''
46        elif nameBool:46        elif nameBool:
47            name += char47            name += char
48        elif char == ']':48        elif char == ']':
49            ageBool = False49            ageBool = False
50            pure_age = ''50            pure_age = ''
51            age = int(pure_age.join([x for x in age if x in '0123456789']))51            age = int(pure_age.join([x for x in age if x in '0123456789']))
52        elif ageBool:52        elif ageBool:
53            age += char53            age += char
54        elif char == '\n':54        elif char == '\n':
55            wishesBool = True55            wishesBool = True
56            wishes = []56            wishes = []
57    return list(xd)57    return list(xd)
Legends
Colors
 Added 
Changed
Deleted
Links
(f)irst change
(n)ext change
(t)op