Найти - Пользователи
Полная версия: Регулярные выражения
Начало » Центр помощи » Регулярные выражения
1
Osanve
Здравствуйте.
Пришлось осваивать регулярные выражения. Информации в принципе очень много, но никак не могу разобраться с одной проблемой.

На вход подаю строку “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)
В чем может быть проблема?

Заранее спасибо.
Enchantner
Osanve
а если re.compile(reg, r.UNICODE)?
Osanve
reg = re.compile(reg, r.UNICODE)
$ ./main.py
–>456
\b+

Traceback (most recent call last):
File “./main.py”, line 49, in <module>
reg = word_to_re(word)
File “./main.py”, line 37, in word_to_re
reg = re.compile(reg, r.UNICODE)
NameError: global name ‘r’ is not defined
$

reg = re.compile(reg, re.UNICODE)
$ ./main.py
–>456
\b+

$
Enchantner
Osanve
а в какой кодировке dict.txt?
Osanve
utf-8
Osanve
Заметил следующее:
При выполнении кода:
reg = re.compile(r"и [0-9]+", re.UNICODE)
search_words(reg)
Слово “и” находится нормально.
А когда делаем следующее:
reg = re.compile(r"[и] [0-9]+", re.UNICODE)
search_words(reg)
то на выходе пусто.
Что в теории РВ я понял не так?
Osanve
Переписал функцию:
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
Теперь все работает нормально. Правда до сих пор интересно почему нельзя задать диапазоном?
dimabest
1. данные из файла нужно декодировать в юникод: i.decode('utf8')
2. перед шаблонами регекспов с русскими буквами поставить u: ur“м-п”
Osanve
dimabest, не помогает. Вывод пустой.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB