Python, регулярное выражение и специальный символ

Как правильно разбить строку, содержащую предложение со специальными символами, используя пробелы в качестве разделителя? Используя метод разложения регулярных выражений, я не могу получить желаемый результат.

Пример кода:

# -*- coding: utf-8 -*-
import re


s="La felicità è tutto" # "The happiness is everything" in italian
l=re.compile("(\W)").split(s)

print " s> "+s
print " wordlist> "+str(l)
for i in l:
    print " word> "+i

Вывод:

 s> La felicità è tutto
 wordlist> ['La', ' ', 'felicit', '\xc3', '', '\xa0', '', ' ', '', '\xc3', '', '\xa8', '', ' ', 'tutto']
 word> La
 word>  
 word> felicit
 word> Ã
 word> 
 word> ?
 word> 
 word>  
 word> 
 word> Ã
 word> 
 word> ?
 word> 
 word>  
 word> tutto

пока я ищу выход, например:

 s> La felicità è tutto
 wordlist> ['La', ' ', 'felicità', ' ', 'è', ' ', 'tutto']
 word> La
 word>  
 word> felicità
 word>  
 word> è
 word>  
 word> tutto

Следует отметить, что s - это строка, возвращаемая из другого метода, поэтому я не могу заставить кодировку выглядеть как

s=u"La felicità è tutto"

В официальной документации на python Unicode и reg-ex я не нашел удовлетворительного объяснения.

Спасибо.

Алессандро

Ответ 1

Ваше регулярное выражение должно быть (\s) вместо (\W) следующим образом:

l = re.compile("(\s)").split(s)

Приведенный выше код даст вам точный результат, который вы запросили. Однако следующая строка имеет смысл:

l = re.compile("\s").split(s)

который разбивается на символы пробелов и не дает вам всех пробелов в качестве совпадений. Возможно, они вам понадобятся, поэтому я отправил оба ответа.

Ответ 2

Попробуйте определить кодировку для регулярного выражения:

l=re.compile("\W", re.UNICODE).split(s)

Ответ 3

Я думаю, что в этом случае излишне использовать regexp. Если единственное, что вы хотите сделать, это разделить строку на символы пробелов, я рекомендую использовать метод split в строке

s = 'La felicità è tutto'
words = s.split()

Ответ 4

используя регулярное выражение unicode, будет работать, если вы дадите ему строку unicode, с которой вы начинаете (что вы не указали в приведенном примере). Попробуйте следующее:

s=u"La felicità è tutto" # "The happiness is everything" in italian
l=re.compile("(\W)",re.UNICODE).split(s)

print " s> "+s
print " wordlist> "+str(l)
for i in l:
    print " word> "+i

Результаты:

 s> La felicità è tutto
 wordlist> [u'La', u' ', u'felicit\xe0', u' ', u'\xe8', u' ', u'tutto']
 word> La
 word>  
 word> felicità
 word>  
 word> è
 word>  
 word> tutto

Строка s создается как тип str и, вероятно, будет в кодировке utf-8, которая отличается от юникода.

Ответ 5

Ну, после некоторых дополнительных тестов на Andrew Hare ответ я видел, что символ as() [] - и так далее больше не рассматривается как разделитель, в то время как я хочу разделить предложение (поддерживающее весь разделитель) словами, составленными с ансамблем буквенно-цифровых значений набор в конечном счете расширен с акцентированными символами (то есть все, помеченное как буквенно-цифровое в юникоде). Таким образом, решение kgiannakakis является более правильным, но оно пропускает преобразование строки s в формат unicode.

Возьмите это расширение первого примера:

# -*- coding: utf-8 -*-
import re
s="(La felicità è tutto)"#no explicit unicode given string (UTF8)
l=re.compile("([\W])",re.UNICODE).split(unicode(s,'utf-8'))#split on s converted to unicode from utf8

print " string> "+s
print " wordlist> "+str(l)
for i in l:
    print " word> "+i

Теперь вывод:

 string> (La felicità è tutto)
 wordlist> [u'', u'(', u'La', u' ', u'felicit\xe0', u' ', u'\xe8', u' ', u'tutto', u')', u'']
 word> 
 word> (
 word> La
 word>  
 word> felicità
 word>  
 word> è
 word>  
 word> tutto
 word> )
 word> 

Это именно то, что я ищу.

Приветствия:)

Алессандро