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>
Это именно то, что я ищу.
Приветствия:)
Алессандро