Skip to content

Instantly share code, notes, and snippets.

@anroots
Created May 11, 2012 01:24
Show Gist options
  • Save anroots/2656924 to your computer and use it in GitHub Desktop.
Save anroots/2656924 to your computer and use it in GitHub Desktop.
Poomismängu- ja ristsõnalahendaja, asutab EKI andmebaasi
#!/usr/bin/python
# -*- coding: utf-8 -*-
# Poomismängu- ja ristsõnalahendaja
# Kasutab EKI andmebaasi
# Märge tulevikuks: ära kasuta re-d html-i töötlemiseks! BeautifulSoup!
# A. Roots 2010
import urllib, re, sys
# Siia salvestatakse kõik leitud sõnad
tulemused = []
otsitav = ''
program_mode = 0
ei_sobi = ''
def main():
global otsitav, program_mode, tulemused, ei_sobi
print 'See programm otsib EKI andmebaasist mustriga sobivaid sõnu.'
print 'Lõpetamiseks vajuta Ctrl + C'
print 'Kiirspikker: * on suvaline märgijada, ? üks märk. + sõne ees nõuab esinemist, - sõne ees keelab.'
print 'Sõnede vahel < (eespool), > (tagapool), = (ligiduses) ja _ (järgmine). Jutumärkides "mitu järjestikust sõnet" on samaväärne operaatoriga mitu_järjestikust_sõnet.'
print 'NÄIDE: Sõna "kapsas" saab otsida nii: ka??a? VÕI kap??s VÕI k*as jne'
program_mode = raw_input('Kui mängid poomismängu, sisesta 1. Teistel juhtudel vajuta ENTER.')
while 1:
try:
tulemused = []
otsitav = ''
ei_sobi = ''
print ''
otsitav = raw_input('Otsi: ')
save_source()
search_results()
# Poomismängus tuleb kõrvaldada korduvad tähed
if program_mode:
eliminate_impossible()
print 'Leidsin', len(tulemused), 'vastust.'
kuvatavad_vastused = '|'
for vastus in tulemused:
# Väldime duplikaate
if vastus.upper() in kuvatavad_vastused.upper():
pass
else:
kuvatavad_vastused = kuvatavad_vastused + vastus.upper() + '|'
print 'Poomismängu otsinguga "'+otsitav+'" ei sobinud järgmised sõnad:',ei_sobi.upper()
print 'Vastused:', kuvatavad_vastused
except KeyboardInterrupt:
print 'nProgramm suletud.'
sys.exit(0)
# Otsib etteantud reast vastet
def search_line(line):
global tulemused
expression = '((.*?)|(.*?))'
match = re.compile(expression).search(line)
if match:
# EKI-s on vastused erinevas formaadis, korjame üleliigse ära
puhastatud_vastus = remove_html_tags(match.group(1))
tulemused.append(puhastatud_vastus)
# Avab source faili ja söödab sealt rida-rea kaupa andmeid
def search_results():
file = open('source.txt', 'r')
line = file.readline()
while line:
# Mõni vastus on teisite formaaditud, eemalda see
if 'background-color:lightsalmon;' in line:
search_line(line.replace('background-color:lightsalmon;',''))
else:
search_line(line)
line = file.readline()
file.close()
# Haara eki source koos vastustega ja salvesta faili
def save_source():
global otsitav
otsitav_safe = urllib.urlencode({'Q':otsitav})
eki_url = 'http://www.eki.ee/dict/qs2006/index.cgi?'+otsitav_safe+'&F=M&O=0&E=0'
fd = urllib.urlopen(eki_url)
source = fd.read();
file = open('source.txt','w')
file.write(source)
file.close()
def remove_html_tags(data):
p = re.compile(r'<.*?>')
return p.sub('', data)
# Poomismängu puhul võta võimatud sõnad välja
def eliminate_impossible():
global tulemused, otsitav, ei_sobi
otsi_man = []
for letter in otsitav:
otsi_man.append(letter)
#Iga EKI sõnaga tee...
for tulemus in tulemused:
letterman = []
missing_char = []
#Iga tähega selles sõnas tee...
for tulemus_letter in tulemus:
letterman.append(tulemus_letter)
if len(letterman) <= len(otsi_man):
#Nüüd on sõna kõik tähed letterman-is
cnt = 0
for l in letterman:
if l == otsi_man[cnt]:
pass
else:
missing_char.append(l)
cnt += 1
aa = set(missing_char)
bb = set(otsitav)
if set(aa) & set (bb):
ei_sobi = ei_sobi +' '+ tulemus
tulemused.remove(tulemus)
if __name__ == '__main__':
main()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment