2016-03-13 2 views
1

Я использую Python 2.x и я загрузке текста из файла, а вот одна строка из текстапростое регулярное выражение питона

Odio ¿Mañana pensar porque RT luego pasa lo que pasa Marzo ♡♡♡

Я нашел это регулярное выражение [^ \ x30- \ XFF], чтобы соответствовать именно символы, которые я хотел (с помощью онлайн-инструментов, регулярные выражения), но когда я использую его в своем коде, как это:

filtered_comments = re.sub("[^\x30-\xFF]", " ", all_comments) 

он не совпадает с тем же символы; вы можете попробовать это на http://pythex.org поэтому в этом тексте я хочу совместить ♡♡♡ и оставить ñ и ¿ .... любая идея?

+0

Почему не '[♡]'? –

+0

, потому что на самом деле меня не интересует только эта строка, у меня есть класс символов, отличных от ASCII, в тексте файла, в котором я работаю, с которым мне нужно выполнить захват, но не всех не-ASCII, таких как: – 7kemZmani

ответ

2

Попробуйте следовать сценарию, см. #coding=utf-8 на первой линии. Для получения дополнительной информации см PEP-0263

# coding=utf-8 
import re 

comments = u"Odio ¿Mañana pensar porque RT luego pasa lo que pasa Marzo ♡♡♡" 

rx = re.compile(u"[\u2661]+") 

# If you want to remove non-ASCII characters, as you mentioned in comments, 
# uncomment following regex. 
# Downside is it will remove all accented characters too. 
# 
# rx = re.compile(u"[^\x00-\x7F]+") 

filtered_comments = re.sub(rx, " ", comments) 

print filtered_comments 

Это напечатает

Odio ¿Mañana pensar porque RT luego pasa lo que pasa Marzo 
+0

Я скопировал и вставил ваш код и получил это сообщение об ошибке: «UnicodeEncodeError: кодек ascii не может кодировать символ u '\ xbf' в позиции 5: порядковый номер не в диапазоне (128)« – 7kemZmani

+0

вы добавили '# coding = utf-8 'как первая строка вашего скрипта python? – Saleem

+0

скопируйте опубликованный код в новый файл python и попробуйте запустить его. – Saleem

1

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

Если ваша строка имеет тип str, вам необходимо закодировать ее, используя правильную кодировку. Если предположить, что кодировка UTF-8, это будет работать:

filtered_comments = re.sub("[^\x30-\xFF]", " ", all_comments.decode('utf-8')) 

Еще одна вещь, чтобы отметить: вы ^\x30-\xFF матчи ! и # и ряд других символов, которые ниже \x30. Может быть, вы хотите ^\x20-\xFF, потому что \x20 - это место, которое является самым низким типичным символом ASCII?

+0

all_comments имеет тип 'str', и он изначально печатает все символы без символов ASCII просто отлично, без добавления «# coding = utf-8» сверху или что-то еще. Теперь, когда я копирую и прохожу мимо вашей строки, я получаю следующую ошибку msg. «UnicodeEncodeError: кодек« ascii »не может кодировать символ u '\ xbf' в позиции 5: порядковый номер не в диапазоне (128)« – 7kemZmani

+0

Если это тип 'str', вам нужно использовать метод' decode', чтобы получить его в формат 'unicode'. Это сообщение об ошибке означает, что 'utf-8', вероятно, не является правильной кодировкой. Вам нужно использовать правильное кодирование. Вам нужно посмотреть, как проверить кодировку символов в текстовом редакторе или для вашей операционной системы, а затем использовать эту кодировку. –

+0

В какой операционной системе вы работаете? Я считаю, что кодировка по умолчанию в Windows иногда «utf-16-be». –

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