Citat:
a1234567:
Zadatak 34:
Napisati funkciju koja će u datom engleskom tekstu izračunati zbir brojeva.
Računaju se samo posebni brojevi. Ako je broj deo reči, ne ulazi u zbir.
'Petersen between 1845 and 1910 year') == 3755
'2020-02-20' == 2062
Ima vise resenja, koja se svode na isto: sve sto nije cifra zameniti razmkom, pa onda udariti split() i sabrati. Osnovacko reesnje:
Code (python):
def sum_numbers(text):
sum = 0
newtext = ''
text = text.lower()
text = text.replace('1st', ' ')
text = text.replace('2nd', ' ')
text = text.replace('3rd', ' ')
for ch in text:
newtext += ch if ch.isdigit() else ' '
for n in newtext.split():
sum += int(n)
return sum
Resenje sa regularnim izrazima:
Code (python):
import re
def sum_numbers(text):
sum = 0
for n in re.sub('\D', ' ', re.sub('1st|2nd|3rd', ' ', text.lower())).split():
sum += int(n)
return sum
ili, da bude jasnije:
Code (python):
import re
def sum_numbers(text):
sum = 0
text = re.sub('1st|2nd|3rd', ' ', text.lower()) # Zameni 1st, 2nd i 3rd razmaknicom
text = re.sub('\D', ' ', text) # Zameni sve non-digit znakove razmaknicom
for n in text.split():
sum += int(n)
return sum
U ovom gornjem reesnju smo najpre zamenili stringove '1st', '2nd' i '3rd' razmakom. Slucaj radi i za '1ST', '2nD' i tome slicno, za sta se pobrinuo lower(). Potom u takvom stringu zamenimo sve znake koji nisu cifre (regexp '\D'). Ostatak je identican - split() to pretvori u niz kontinualnih karaktera (npr. ' 4 55 6666 ' daje ['4', '55', '6666']), sto onda saberemo.
Ako treba uzeti u obzir i znake + i -, tada je prica malcice slozenija, ali ne preterano. Najpre treba razdvojiti + i - znake koji stoje uz cifre i one koji ne stoje uz cifre. Npr. '-G' i '+A' s uobicni stringovi, dok su '-3' i '+123' brojevi. Najlakse je primeniti:
text = text.replace('-', ' -0').replace('+', ' +0')
Primer:
Code (python):
>>> text='44, is - -G 2002-02+02'
>>> text = text.replace('-', ' -0').replace('+', ' +0')
>>> text
'44, is -0 -0G 2002 -002 +002'
Potom zamenimo sve sto nije cifra, + ili -:
Code (python):
>>> re.sub('[^\d+-]', ' ', text)
'44 -0 -0 2002 -002 +002'
Nadalje je lako, split() ce ovo gore da pretvori u niz, a int(-0) i int(+0) je uvek 0.