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

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

1 точки общо

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

 1import re
 2
 3def get_wishes(cur_str):
 4    wishes = []
 5    while True:
 6        try:
 7            wish_start = re.search(r'\s*(-|\*)\s*-*\s*', cur_str).end()
 8            cur_str = cur_str[wish_start:]
 9        except AttributeError:
10            break
11        wish_end = re.search(r'\n', cur_str) 
12        wish_end = len(cur_str) if not wish_end else wish_end.start()
13        wishes.append(cur_str[:wish_end])
14        cur_str = cur_str[wish_end:]
15
16    return tuple(wishes)
17
18def generate_tuple(start, end, string):
19    cur_str = string[start:end]
20
21    match_coef = re.search(r'(?<=\()\d*\.\d*(?=\))', cur_str)
22    coef = float(cur_str[match_coef.start():match_coef.end()])
23
24    cur_str = cur_str[match_coef.end() + 1:]
25    match_name = re.search(r' +.* +(?=\[)', cur_str)
26    name = cur_str[match_name.start():match_name.end()].strip()
27    
28    cur_str = cur_str[match_name.end():]
29    match_age = re.search(r'(?<=\[)\d*', cur_str)
30    age = int(cur_str[match_age.start():match_age.end()])
31
32    cur_str = cur_str[match_age.end() + 1:]
33    wishes = get_wishes(cur_str)
34
35    return (coef, name, age, wishes)
36
37def parse_wishlist(string):
38    result = []
39    braces = re.finditer(r'^\(', string, re.MULTILINE)
40    try:
41        prev_brace = next(braces)
42    except StopIteration:
43        return result
44
45    for cur_brace in braces:
46        result.append(generate_tuple(prev_brace.start(), cur_brace.start(), string))
47        prev_brace = cur_brace
48
49    result.append(generate_tuple(prev_brace.start(), len(string), string))
50    return result

EF.
======================================================================
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', ('Плейстейша[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))
File "/tmp/solution.py", line 46, in parse_wishlist
result.append(generate_tuple(prev_brace.start(), cur_brace.start(), string))
File "/tmp/solution.py", line 22, in generate_tuple
coef = float(cur_str[match_coef.start():match_coef.end()])
AttributeError: 'NoneType' object has no attribute 'start'

======================================================================
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', ('Плейстейша[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 113, in test_half
self.assertEqual(expected_half, parse_wishlist(half))
AssertionError: Lists differ: [(3.1[252 chars]о лего (тамън отвориха лицензиран магазин)', 'Хлороформ'))] != [(3.1[252 chars]о лего (тамън отвориха лицензиран магазин)', 'Хлороформ', ''))]

First differing element 2:
(99.9[100 chars]то лего (тамън отвориха лицензиран магазин)', 'Хлороформ'))
(99.9[100 chars]то лего (тамън отвориха лицензиран магазин)', 'Хлороформ', ''))

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

+ 'Хлороформ',
? ^

+ ''))]

----------------------------------------------------------------------
Ran 3 tests in 0.003s

FAILED (failures=1, errors=1)

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

Имаш само една разлика, за да ти мине теста - един празен match накрая на единия елемент. Бонус точка. :) **Едит:** Нямаш бонус точка, защото просто направих тестовете по-либерални и си я имаш от резултатите така или иначе.
История

f1import ref1import re
22
3def get_wishes(cur_str):3def get_wishes(cur_str):
4    wishes = []4    wishes = []
5    while True:5    while True:
6        try:6        try:
7            wish_start = re.search(r'\s*(-|\*)\s*-*\s*', cur_str).end()7            wish_start = re.search(r'\s*(-|\*)\s*-*\s*', cur_str).end()
8            cur_str = cur_str[wish_start:]8            cur_str = cur_str[wish_start:]
9        except AttributeError:9        except AttributeError:
10            break10            break
11        wish_end = re.search(r'\n', cur_str) 11        wish_end = re.search(r'\n', cur_str) 
12        wish_end = len(cur_str) if not wish_end else wish_end.start()12        wish_end = len(cur_str) if not wish_end else wish_end.start()
13        wishes.append(cur_str[:wish_end])13        wishes.append(cur_str[:wish_end])
14        cur_str = cur_str[wish_end:]14        cur_str = cur_str[wish_end:]
1515
16    return tuple(wishes)16    return tuple(wishes)
1717
18def generate_tuple(start, end, string):18def generate_tuple(start, end, string):
19    cur_str = string[start:end]19    cur_str = string[start:end]
2020
21    match_coef = re.search(r'(?<=\()\d*\.\d*(?=\))', cur_str)21    match_coef = re.search(r'(?<=\()\d*\.\d*(?=\))', cur_str)
22    coef = float(cur_str[match_coef.start():match_coef.end()])22    coef = float(cur_str[match_coef.start():match_coef.end()])
2323
24    cur_str = cur_str[match_coef.end() + 1:]24    cur_str = cur_str[match_coef.end() + 1:]
25    match_name = re.search(r' +.* +(?=\[)', cur_str)25    match_name = re.search(r' +.* +(?=\[)', cur_str)
26    name = cur_str[match_name.start():match_name.end()].strip()26    name = cur_str[match_name.start():match_name.end()].strip()
27    27    
28    cur_str = cur_str[match_name.end():]28    cur_str = cur_str[match_name.end():]
29    match_age = re.search(r'(?<=\[)\d*', cur_str)29    match_age = re.search(r'(?<=\[)\d*', cur_str)
30    age = int(cur_str[match_age.start():match_age.end()])30    age = int(cur_str[match_age.start():match_age.end()])
3131
32    cur_str = cur_str[match_age.end() + 1:]32    cur_str = cur_str[match_age.end() + 1:]
33    wishes = get_wishes(cur_str)33    wishes = get_wishes(cur_str)
3434
35    return (coef, name, age, wishes)35    return (coef, name, age, wishes)
3636
t37def parse_wishlists(string):t37def parse_wishlist(string):
38    result = []38    result = []
39    braces = re.finditer(r'^\(', string, re.MULTILINE)39    braces = re.finditer(r'^\(', string, re.MULTILINE)
40    try:40    try:
41        prev_brace = next(braces)41        prev_brace = next(braces)
42    except StopIteration:42    except StopIteration:
43        return result43        return result
4444
45    for cur_brace in braces:45    for cur_brace in braces:
46        result.append(generate_tuple(prev_brace.start(), cur_brace.start(), string))46        result.append(generate_tuple(prev_brace.start(), cur_brace.start(), string))
47        prev_brace = cur_brace47        prev_brace = cur_brace
4848
49    result.append(generate_tuple(prev_brace.start(), len(string), string))49    result.append(generate_tuple(prev_brace.start(), len(string), string))
50    return result50    return result
Legends
Colors
 Added 
Changed
Deleted
Links
(f)irst change
(n)ext change
(t)op