LINUX.ORG.RU

Регулярные выражения, Python и кириллица


0

0

Задача - поиск в файлах с русским текстом в кодировке cp1251.
Не получается искать интервалы, составленные кириллицей.

Кто сталкивался, подскажите, как исправить функцию или выражение:

#!/usr/local/bin/python
# -*- coding: utf-8

import re
import codecs

def grab_ru(files=[]):
found=[]
if files !=None:
txtsrch=re.compile(r"фы")# такое выражение находит,
## txtsrch=re.compile(r"[фы]")# а такое НЕ находит,

for file in files:
for line in open(file, 'r'):
## без перекодировки тоже не работает с русским
line=codecs.getdecoder('cp1251')(line)[0]
line=codecs.getencoder('utf8')(line)[0]

found.extend(mailsrch.findall(line))
u={}
for item in found:
u[item] =1

return u.keys()

print grab_ru(files=['ru.txt'])

Спасибо

anonymous

извините, сбились интервалы и опечатка
в предыдущем посте
#!/usr/local/bin/python
# -*- coding: utf-8

import re
import codecs

def grab_ru(files=[]):
found=[]
if files !=None:
txtsrch=re.compile(r"фы")# такое выражение находит,
## txtsrch=re.compile(r"[фы]")# а такое НЕ находит,

for file in files:
for line in open(file, 'r'):
## без перекодировки тоже не работает с русским
line=codecs.getdecoder('cp1251')(line)[0]
line=codecs.getencoder('utf8')(line)[0]

found.extend(txtsrch.findall(line))
u={}
for item in found:
u[item] =1

return u.keys()

print grab_ru(files=['ru.txt'])

Спасибо

anonymous
()
Ответ на: комментарий от anonymous

На счет regexp не подскажу, на счет перекодировки . # -*- coding: utf-8 <- По умолчанию UTF-8 значит cp1251 не родной %) line=codecs.getdecoder('cp1251')(line)[0] line=codecs.getencoder('utf8')(line)[0] Лишнее, line это объект string, у него есть метод decode, encode line=codecs.getdecoder('cp1251')(line)[0] == line.decode("cp1251"),

Без перекодировки работать не будет, UTF-8 по умолчанию, на счет regexp ищи O'Reilly - Mastering Regular Expressions.pdf , лучше мануала нет. если нужно искать только "фы" , то можно обойтись без re , string.find() find( s, sub[, start[,end]])

Return the lowest index in s where the substring sub is found such that sub is wholly contained in s[start:end]. Return -1 on failure. Defaults for start and end and interpretation of negative values is the same as for slices.

Надеюсь поможет.

anonymous
()
Ответ на: комментарий от watashiwa_daredeska

Спасибо!
Работающий вариант с подачи watashiwa_daredeska.

#!/usr/local/bin/python
# -*- coding: utf-8
import re
import codecs

def grab_ru(files=[]):
    found=[]
    if files !=None:
        txtsrch=re.compile(ur"[фы]")
    for file in files:
        for line in open(file, 'r'):
## без перекодировки тоже не работает с русским
            line=codecs.getdecoder('cp1251')(line)[0]
            found.extend(txtsrch.findall(line))
    u={}
    for item in found:
        u[item] =1

    return u.keys()

print grab_ru(files=['ru.txt']) 

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.