2013-05-15 2 views
2

Я новичок в Python, так что это может показаться очень простым. Я пытаюсь удалить все цифры #, и если одна и та же буква повторяется более двух раз подряд, мне нужно изменить ее только на две буквы. Эта работа отлично, но не с ØÆÅ.Python regex с буквами ØÆÅ

Любые идеи, как это можно сделать с помощью букв ØÆ?

#!/usr/bin/python 
# -*- coding: utf-8 -*- 

import math, re, sys, os, codecs 
reload(sys) 
sys.setdefaultencoding('utf-8') 
text = "ån9d ånd ååååånd d9d flllllløde... :)asd " 

# Remove anything other than digits 
text = re.sub(r'#', "", text) 
text = re.sub(r"\d", "", text) 
text = re.sub(r'(\w)\1+', r'\1\1', text) 
print "Phone Num : "+ text 

В результате я получаю сейчас:

Phone Num : ånd ånd ååååånd dd flløde... :)asd 

Что я хочу:

Phone Num : ånd ånd åånd dd flløde... :)asd 
+0

Мы освещали это раньше, не так ли? Используйте Unicode, а не байтовые строки. –

+0

Из моего [ответа на ваш предыдущий вопрос] (http://stackoverflow.com/questions/16549161/python-re-compile-and-split-with-charcters/16549766#16549766): * В Python 2 вы бы используйте [пример строки юникода], обратите внимание на главный префикс u на строку * и * [регулярное выражение с набором re.UNICODE] *. –

+0

Привет @MartijnPieters, просмотрев комментарии, попробуйте что-нибудь, что я нашел решение. – boje

ответ

5

Вы должны работать со значениями Unicode, а не с байтовых строк. Кодировка UTF-8 å: два байта, а регулярное выражение соответствует \wтолько соответствует символам ascii, цифрам и символам подчеркивания при работе в режиме, не поддерживающем Unicode по умолчанию.

Из re module documentation на \w:

Когда LOCALE и UNICODE флаги не указаны, соответствует любому алфавитно-цифровой символ и символ подчеркивания; это эквивалентно набору [a-zA-Z0-9_]. С LOCALE он будет соответствовать набору [0-9_] плюс любые символы, определенные как буквенно-цифровые для текущего языкового стандарта. Если установлено UNICODE, это будет соответствовать символам [0-9_] плюс все, что классифицируется как буквенно-цифровое в базе данных свойств символов Юникода.

К сожалению, даже при переключении на правильное использование Unicode значения (с помощью Юникода u'' буквального или пути декодирования исходных данных для значений Юникода), используя регулярное выражение Unicode (re.sub(ur'...')) и используя re.UNICODE флаг для переключения \w чтобы соответствовать Unicode буквенно-цифровых символов, модуль Python re имеет ограниченную поддержку Unicode соответствия еще:

>>> print re.sub(ur'(\w)\1+', r'\1\1', text, re.UNICODE) 
ånd ånd ååååånd dd flløde... :)asd 

потому å не распознается, как буквенно-цифровые:

>>> print re.sub(ur'\w', '', text, re.UNICODE) 
å å ååååå ø... :) 

Решение использовать внешний regex library, который является версией re библиотеки, которая добавляет надлежащее полная поддержка Юникода:

>>> import regex 
>>> print regex.sub(ur'(\w)\1+', r'\1\1', text, re.UNICODE) 
ånd ånd åånd dd flløde... :)asd 

Этот модуль может сделать больше, чем просто признать более буквенно-цифровые символы в значениях Unicode, дополнительную информацию см. на странице связанного пакета.

0

Изменение:

text = u"ån9d ånd åååååååånd d9d flllllløde... :)asd " 

и

text = re.sub(r'(\w)\1+', r'\1\1', text) 

COMPELTE РЕШЕНИЕ

import math, re, sys, os, codecs 
reload(sys) 
sys.setdefaultencoding('utf-8') 
text = u"ån9d ånd åååååååånd d9d flllllløde... :)asd " 

# Remove anything other than digits 
text = re.sub(r'#', "", text) 
text = re.sub(r"\d", "", text) 
text = re.sub(r'(\w)\1+', r'\1\1', text) 
text = re.sub(r'(\W)\1+', r'\1\1', text) 
print "1: "+ text 

Print:

1: ånd ånd åånd dd flløde.. :)asd 
+0

Также опция; обратите внимание, что теперь вы меняете '...' на '..', но это может быть хорошо для ваших нужд. –

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