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

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

1 точки общо

0 успешни теста
3 неуспешни теста
Код

 1import re
 2
 3wishlsit_regex = r'\(([\d.]+)\)\s*([\w\s\"]+)\s*\[(\d+)\s*(?:.*)?\]\s*((?:\s*[-*]\s*.+)+)?'
 4
 5
 6def is_blank(test_string):
 7    """Check if a string is empty or blank"""
 8    return not (test_string and test_string.strip())
 9
10
11def parse_wishes(wishes):
12    """Parse wishes from a list of strings by
13    splitting them by '-' or '*' and removing empty strings"""
14    result = []
15    for wish in wishes:
16        split_wishes = re.split(r'\s*[-*]\s+', wish)
17        split_wishes = list(filter(lambda x: not is_blank(x), split_wishes))
18        result.append(tuple(split_wishes))
19
20    return result
21
22
23def parse_wishlist(input_string):
24    """Parse a wishlist string and return a list of tuples"""
25    split = re.findall(wishlsit_regex, input_string)
26    wishes = parse_wishes(list(map(lambda x: x[3], split)))
27
28    result = []
29    for i in range(len(split)):
30        result.append(split[i][:3] + (wishes[i],))
31
32    return result

FFF
======================================================================
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', ('Плейстейшан', 'Количка с диста[90 chars]',))] != [('3.14', 'Иван Иванов ', '10', ('Плейстейшан', 'Количка с дист[93 chars]',))]

First differing element 0:
('3.14', 'Иван Иванов', '10', ('Плейстейшан', 'Количка с диста[14 chars]че'))
('3.14', 'Иван Иванов ', '10', ('Плейстейшан', 'Количка с дист[15 chars]че'))

[('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.14, 'Иван Иванов', 10, ('Плейстейшан', [486 chars]м'))] != [('3.14', 'Иван Иванов ', '10', ('Плейстейш[284 chars]м'))]

First differing element 0:
(3.14, 'Иван Иванов', 10, ('Плейстейшан', [30 chars]че'))
('3.14', 'Иван Иванов ', '10', ('Плейстейш[35 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',
- [(3.14, 'Иван Иванов', 10, ('Плейстейшан', 'Количка с дистанционо', 'Братче')),
? ^^^^^^^^^^^^^^^^^^^^^^^^^^

+ ('Плейстейшан', 'Количка с дистанционо', 'Братче')),
? ^

- (1.94, 'Georgi "Jorkata" Georgiev', 43, ('Vancheto ot tretiq etaj',)),
+ ('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,
+ ('99.9534412345',
? + +

- 'На мама сладкото ангелче',
+ 'На мама сладкото ангелче ',
? +

- 3,
+ '3',
? + +

('Най-хубавото дървено конче (размер 1.5)',
'Най-страхотното лего (тамън отвориха лицензиран магазин)',
'Хлороформ'))]

======================================================================
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', ('Плейстейшан', 'Количка с диста[90 chars]',))] != [('3.14', 'Иван Иванов ', '10', ('Плейстейшан', 'Количка с дист[93 chars]',))]

First differing element 0:
('3.14', 'Иван Иванов', '10', ('Плейстейшан', 'Количка с диста[14 chars]че'))
('3.14', 'Иван Иванов ', '10', ('Плейстейшан', 'Количка с дист[15 chars]че'))

[('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 113, in test_half
self.assertEqual(expected_half, parse_wishlist(half))
AssertionError: Lists differ: [(3.14, 'Иван Иванов', 10, ('Плейстейшан', [268 chars]м'))] != [('3.14', 'Иван Иванов ', '10', ('Плейстейш[284 chars]м'))]

First differing element 0:
(3.14, 'Иван Иванов', 10, ('Плейстейшан', [30 chars]че'))
('3.14', 'Иван Иванов ', '10', ('Плейстейш[35 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',)),
? + + ++ + +

- (99.9534412345,
+ ('99.9534412345',
? + +

- 'На мама сладкото ангелче',
+ 'На мама сладкото ангелче ',
? +

- 3,
+ '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', ('Плейстейшан', 'Количка с диста[90 chars]',))] != [('3.14', 'Иван Иванов ', '10', ('Плейстейшан', 'Количка с дист[93 chars]',))]

First differing element 0:
('3.14', 'Иван Иванов', '10', ('Плейстейшан', 'Количка с диста[14 chars]че'))
('3.14', 'Иван Иванов ', '10', ('Плейстейшан', 'Количка с дист[15 chars]че'))

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

First differing element 0:
(3.14, 'Иван Иванов', 10, ('Плейстейшан', [30 chars]че'))
('3.14', 'Иван Иванов ', '10', ('Плейстейш[35 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',))]
? + + ++ + +

----------------------------------------------------------------------
Ran 3 tests in 0.006s

FAILED (failures=3)

Дискусия
Виктор Бечев
27.12.2023 12:07

Имаш кофти прихващания на интервали тук-таме. На теория кофти регекс, но по-важното - на практика почти правилно решение и упражняване на регексите. Получаваш бонус.
История
Това решение има само една версия.