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

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

1 точки общо

2 успешни теста
1 неуспешни теста
Код

 1import re
 2
 3def parse_wishlist(wished_gifts):
 4    pattern = re.compile(r'\(([\d.]+)\)\s*([^[]+)\s*\[(\d+)\s*(?:\s*\D*)?\]\s*((?:(?:\s*-|\s*\*\s*)(?:.*?)(?=\n[-*\n]|$))*)', re.DOTALL)
 5    wishlists_found = pattern.findall(wished_gifts)
 6    parsed_information = []
 7    for wishlist_information in wishlists_found:
 8        niceness, name, age, gifts_list = wishlist_information
 9        niceness = float(niceness.strip())
10        name = str(name.strip())
11        age = int(age.strip())
12
13        gifts = re.split(r'\s*\-\s*(?!\S)', gifts_list)
14        new_gifts = []
15        for gift in gifts:
16            collection = re.split(r'\s*\*\s*(?!\S)', gift)
17            for element in collection:
18                new_gifts.append(element)
19                
20        valid_gifts = []
21        for gift in new_gifts:
22            if gift != "":
23                valid_gifts.append(gift.strip())
24        parsed_information.append((niceness, name, age, tuple(valid_gifts)))
25    return parsed_information

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])), (1.0, 'Gospodin (he/him) Mitko', 12, ('1\n[217 chars]м'))]

First differing element 2:
(6.9, 'Mr. D-r', 999, ('[Doctor stuff] Ска[72 chars]пе'))
(1.0, 'Gospodin (he/him) Mitko', 12, ('1\n[50 chars]st'))

First list contains 1 additional elements.
First extra element 4:
(99.9534412345, 'На мама сладкото ангелче', 3, ('Най-хубавото дървено конче (размер 1.5)', 'Най-страхотното лего (тамън отвориха лицензиран магазин)', 'Хлороформ'))

[(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,
+ (1.0,
? ++

'Gospodin (he/him) Mitko',
12,
- ('1', '2', '3', '4', 'Malko mi pisva da go pisha toq test')),
? ^^^^

+ ('1\n -2', '3', '4', 'Malko mi pisva da go pisha toq test')),
? ^^^^

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

----------------------------------------------------------------------
Ran 3 tests in 0.004s

FAILED (failures=1)

Дискусия
История

f1import ref1import re
22
3def parse_wishlist(wished_gifts):3def parse_wishlist(wished_gifts):
4    pattern = re.compile(r'\(([\d.]+)\)\s*([^[]+)\s*\[(\d+)\s*(?:\s*\D*)?\]\s*((?:(?:\s*-|\s*\*\s*)(?:.*?)(?=\n[-*\n]|$))*)', re.DOTALL)4    pattern = re.compile(r'\(([\d.]+)\)\s*([^[]+)\s*\[(\d+)\s*(?:\s*\D*)?\]\s*((?:(?:\s*-|\s*\*\s*)(?:.*?)(?=\n[-*\n]|$))*)', re.DOTALL)
5    wishlists_found = pattern.findall(wished_gifts)5    wishlists_found = pattern.findall(wished_gifts)
6    parsed_information = []6    parsed_information = []
7    for wishlist_information in wishlists_found:7    for wishlist_information in wishlists_found:
8        niceness, name, age, gifts_list = wishlist_information8        niceness, name, age, gifts_list = wishlist_information
9        niceness = float(niceness.strip())9        niceness = float(niceness.strip())
10        name = str(name.strip())10        name = str(name.strip())
11        age = int(age.strip())11        age = int(age.strip())
1212
n13        gifts = re.split(r'\s*\-\s*(?!\S)',gifts_list)n13        gifts = re.split(r'\s*\-\s*(?!\S)', gifts_list)
14        new_gifts = []14        new_gifts = []
15        for gift in gifts:15        for gift in gifts:
16            collection = re.split(r'\s*\*\s*(?!\S)', gift)16            collection = re.split(r'\s*\*\s*(?!\S)', gift)
17            for element in collection:17            for element in collection:
18                new_gifts.append(element)18                new_gifts.append(element)
19                19                
20        valid_gifts = []20        valid_gifts = []
21        for gift in new_gifts:21        for gift in new_gifts:
22            if gift != "":22            if gift != "":
23                valid_gifts.append(gift.strip())23                valid_gifts.append(gift.strip())
t24        parsed_information.append((niceness,name,age,tuple(valid_gifts)))t24        parsed_information.append((niceness, name, age, tuple(valid_gifts)))
25    return parsed_information25    return parsed_information
Legends
Colors
 Added 
Changed
Deleted
Links
(f)irst change
(n)ext change
(t)op