2015-08-28 1 views
2

У меня есть этот скрипт, который читает большое количество текстовых файлов, написанных на шведском языке (часто с письмами åäö). Он печатает все, что просто отлично, из словаря, если я петлю над d и dictionary[]. Однако регулярное выражение (из исходного ввода с добавлением u'.*') не выполняется при правильном возврате utf-8.Python re.findall не работает в UTF-8, а остальная часть скрипта успешно завершена

# -*- coding: utf8 -*- 
from os import listdir 
import re 
import codecs 
import sys 

print "Välkommen till SOU-sök!" 
search_word = raw_input("Ange sökord: ") 

dictionary = {} 
for filename in listdir("20tal"): 
    with open("20tal/" + filename) as currentfile: 
     text = currentfile.read() 
     dictionary[filename] = text 

for d in dictionary: 
    result = re.findall(search_word + u'.*', dictionary[d], re.UNICODE) 
    if len(result) > 0: 
     print "Filnament är:\n %s \noch sökresultatet är:\n %s" % (d, result) 

Edit: Выход следующим образом:

Если я вход:

katt 

Я получаю следующий вывод:

Filnament är: Betänkande och förslag angående vissa ekonomiska spörsmål berörande enskilda järnvägar - SOU 1929:2.txt 

och sökresultatet är: 

['katter, r\xc3\xa4ntor m. m.', 'katter m- m., men exklusive r \xc3\xa4 nor m.', 'kattemedel subventionerar', av totalkostnaderna, ofta \xe2\x80\x94 med eller utan', 'kattas den nuvarande bilparkens kapitalv\xc3\xa4rde till 500 milj. 

Здесь Имя файла d печатается правильно, но не результат re.findall

+0

Что вы имеете в виду 'терпит неудачу при возвращении UTF-8'. Вызывает ли ошибка или просто не находит совпадение? –

+0

Можете ли вы добавить образец ввода и показать, что это ваш выход? – Kasramvd

+0

Пожалуйста, измените это на свой вопрос. Комментарии не достаточно хорошо отформатированы для такого рода вещей. –

ответ

1

В Python 2.x список юникода элементы обычно выходной спасся, если вы петлю через каждый или присоединиться к ним; может быть, попробовать что-то такое, как это:

result = ', '.join(result) 

if len(result) > 0: 
    print (u"Filnament är:\n %s \noch sökresultatet är:\n %s" % (d, result.decode('utf-8'))) 

Входной:

katt 

Результат:

katter, räntor m. m. katter m- m., men exklusive r ä nor m. kattemedel subventionerar av totalkostnaderna, ofta — med eller utan kattas den nuvarande bilparkens kapitalvärde till 500 milj 
+1

ДА! Это сработало! Результат теперь распечатывает мой åäö как шарм. Большое спасибо! (и всех остальных). – chrisk

0

Способ, которым имена файлов normalized, зависит от файловой системы и ОС. Ваше конкретное регулярное выражение может неправильно соответствовать методу нормализации. Таким образом, считают это решение по remram:

import fnmatch 
def myglob(pattern, directory=u'.'): 
    pattern = unicodedata.normalize('NFC', pattern) 
    results = [] 
    enc = sys.getfilesystemencoding() 
    for name in os.listdir(directory): 
     if isinstance(name, bytes): 
      try: 
       name = name.decode(enc) 
      except UnicodeDecodeError: 
       # Filenames that are not proper unicode won't match any pattern 
       continue 
     if fnmatch.filter([unicodedata.normalize('NFC', name)], pattern): 
      results.append(name) 
    return results 

Я сталкивался с подобной проблемой здесь: Filesystem independent way of using glob.glob and regular expressions with unicode filenames in Python

Смежные вопросы