Форум сайта python.su
Здравствуйте.
Пришлось осваивать регулярные выражения. Информации в принципе очень много, но никак не могу разобраться с одной проблемой.
На вход подаю строку “456”. Регулярка составляется вроде как правильно, но в файле ничего не находит, хотя слова, удовлетворяющие шаблону есть.
Формат файла:
<слово><пробел><число>
Код:
#!/usr/bin/python
# -*- encoding: utf-8 -*-
import re
def word_to_re(word):
''' Функция преобразует введенные цифры в регулярное выражение
На входе: word - последовательность цифр
На выходе: reg - регулярное выражение или 1, если не удалось его
составить '''
reg = r""
for i in word:
if(i == '1'):
reg += r"[\.,-\?!]"
elif(i == '2'):
reg += r"[а-г]"
elif(i == '3'):
reg += r"[д-з]"
elif(i == '4'):
reg += r"[и-л]"
elif(i == '5'):
reg += r"[м-п]"
elif(i == '6'):
reg += r"[р-у]"
elif(i == '7'):
reg += r"[ф-ч]"
elif(i == '8'):
reg += r"[ш-ы]"
elif(i == '9'):
reg += r"[ь-я]"
else:
print "Неверный символ", i
return 1
reg += r"\b[0-9]+"
print reg
n = raw_input()
reg = re.compile(reg)
return reg
def search_words(reg):
f = open("dict.txt", "r")
for i in f:
reg_result = reg.match(i)
if(reg_result != None):
print i
f.close
word = raw_input("-->")
reg = word_to_re(word)
search_words(reg)
Отредактировано (Сен. 27, 2011 12:22:35)
Офлайн
Osanve
а если re.compile(reg, r.UNICODE)?
Офлайн
reg = re.compile(reg, r.UNICODE)
reg = re.compile(reg, re.UNICODE)
Офлайн
Osanve
а в какой кодировке dict.txt?
Офлайн
utf-8
Офлайн
Заметил следующее:
При выполнении кода:
reg = re.compile(r"и [0-9]+", re.UNICODE)
search_words(reg)
reg = re.compile(r"[и] [0-9]+", re.UNICODE)
search_words(reg)
Офлайн
Переписал функцию:
def word_to_re(word):
''' Функция преобразует введенные цифры в регулярное выражение
На входе: word - последовательность цифр
На выходе: reg - регулярное выражение или 1, если не удалось его
составить '''
reg = r""
for i in word:
if(i == '1'):
reg += r"(.|,|-|?|!)"
elif(i == '2'):
reg += r"(а|б|в|г)"
elif(i == '3'):
reg += r"(д|е|ё|ж|з)"
elif(i == '4'):
reg += r"(и|й|к|л)"
elif(i == '5'):
reg += r"(м|н|о|п)"
elif(i == '6'):
reg += r"(р|с|т|у)"
elif(i == '7'):
reg += r"(ф|х|ц|ч)"
elif(i == '8'):
reg += r"(ш|щ|ъ|ы)"
elif(i == '9'):
reg += r"(ь|э|ю|я)"
else:
print "Неверный символ", i
return 1
reg += r" [0-9]+"
reg = re.compile(reg, re.UNICODE)
return reg
Офлайн
1. данные из файла нужно декодировать в юникод: i.decode('utf8')
2. перед шаблонами регекспов с русскими буквами поставить u: ur“м-п”
Отредактировано (Сен. 28, 2011 06:23:36)
Офлайн
dimabest, не помогает. Вывод пустой.
Офлайн