питон, регулярное выражение и специальный символ - PullRequest
11 голосов
/ 15 марта 2009

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

Пример кода:

# -*- 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 я не нашел удовлетворительного объяснения.

Спасибо.

Alessandro

Ответы [ 5 ]

16 голосов
/ 15 марта 2009

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

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

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

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

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

4 голосов
/ 15 марта 2009

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

l=re.compile("\W", re.UNICODE).split(s)
3 голосов
/ 13 июля 2010

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

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, которая отличается от unicode.

3 голосов
/ 15 марта 2009

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

s = 'La felicità è tutto'
words = s.split()
0 голосов
/ 15 марта 2009

Ну, после некоторых дальнейших тестов ответа Эндрю Хэра я увидел этот символ как () [] - и так далее, больше не считаются разделителем, а я хочу разбить предложение (сохраняя весь разделитель) в словах, составленных из множества буквенно-цифровых значений в конце концов набор расширяется акцентированными символами (то есть все, что помечено как буквенно-цифровое в юникоде). Таким образом, решение 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> 

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

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

Alessandro

...