2015-11-30 2 views
0

У меня есть много строк в формате Юникод, таких как углеродные сополимеры-III \ n12- Géotechnique \ п и многие другие, имеющие множество различных символов Unicode, в строковую переменную с именем txtWords.Поддержание последовательности строк до и после преобразования в ASCII

Моя цель - удалить все символы, отличные от ASCII , при сохранении согласованности строк. Например, я хочу первую очередь предложения в углерода сополимеров III или углерода сополимеров III (без индивидуальной чувствительности здесь), а второй к geotechnique \ п и так далее ...

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

import unicodedata, re 
txtWords = unicodedata.normalize('NFKD', txtWords.lower()).encode('ascii','ignore') 
txtWords = re.sub(r'[^a-z^\n]',r' ',txtWords) 

Если я использую код регулярок первый, то я получаю что-то хуже (в плане того, что я ожидал) :

import unicodedata, re 
    txtWords = re.sub(r'[^a-z^\n]',r' ',txtWords) 
    txtWords = unicodedata.normalize('NFKD', txtWords.lower()).encode('ascii','ignore') 

Таким образом, для строки Géotechnique \ п я получаю otechnique!

Как решить эту проблему?

+0

См Unidecode: HTTPS: //pypi.python .org/pypi/Unidecode/ –

+0

Это зависит от того, почему это сокращение требуется для ASCII. Чтобы ваше регулярное выражение было полезным, вы должны сначала применить регулярное выражение, а затем закодировать его до ASCII. – roeland

+0

@roeland. Хорошо, если я сначала применил регулярное выражение, то получилось еще хуже: ** Géotechnique \ n ** станет ** otechnique ** – Amir

ответ

1

Используйте \w регулярное выражение для полосы, не являющиеся алфавитно-цифровых символов перед разлагающим трик:

#coding:utf8 
from __future__ import unicode_literals,print_function 
import unicodedata as ud 
import re 
txtWords = 'carbon copolymers—III\n12- Géotechnique\n' 
txtWords = re.sub(r'[^\w\n]',r' ',txtWords.lower(),flags=re.U) 
txtWords = ud.normalize('NFKD',txtWords).encode('ascii','ignore').decode() 
print(txtWords) 

Output (Python, 2 и 3):

carbon copolymers iii 
12 geotechnique 
+0

Это не работает. Вы уверены, что это правильный код? После выполнения txtWords = re.sub (r '[^ \ w \ n]', r '', txtWords.lower()) Я получаю ** углеродные сополимеры iii \ n12 g otechnique \ n '** – Amir

+0

@ Амир, вы не указали версию Python. Я использовал Python 3. Обновлен для работы в обоих. 'txtWords' должен быть строкой Unicode для начала, а для' \ w' корректно работать в Python 2, '' '' '' '' '' '' '' '' '' '' требуется для 're.sub'. –

+0

@Amir, код был прав, поэтому я откатил ваше редактирование.'From __future__ import unicode_literals' обрабатывает и переносится на Python 3. –

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