Created
May 11, 2012 01:24
-
-
Save anroots/2656924 to your computer and use it in GitHub Desktop.
Poomismängu- ja ristsõnalahendaja, asutab EKI andmebaasi
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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