2013-05-15 161 views
2

我是Python新手,所以這看起來很容易。我試圖刪除所有,數字,如果相同的字母連續重複兩次以上,我需要將其更改爲只有兩個字母。這個工作完美,但不與ØÆÅ。Python正則表達式與ØÆÅ字母

任何想法如何用ØÆÅ字母做這件事?

#!/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中,你會使用[unicode字符串示例],請注意字符串*和* [帶有re.UNICODE集的正則表達式] *中的前導u前綴。 –

+0

嗨@MartijnPieters,通過查看你的意見,嘗試一些事情,我找到了解決辦法。 – boje

回答

5

您需要使用Unicode值的工作,而不是與字節串。 UTF-8編碼的å兩個字節和正則表達式匹配\w僅限於以默認的不支持Unicode的模式運行時匹配ASCII字母,數字和下劃線。

re module documentation\w

當未指定LOCALEUNICODE標誌,匹配任何字母數字字符和下劃線;這相當於集[a-zA-Z0-9_]。使用LOCALE時,它將匹配集[0-9_]加上任何字符被定義爲當前語言環境的字母數字。如果設置了UNICODE,則它將與字符[0-9_]以及Unicode字符屬性數據庫中分類爲字母數字的任何字符匹配。

不幸的是,即使當切換到正常使用Unicode值(使用一個unicode u''字面或由源數據解碼以Unicode值),使用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庫,增加了適當的完整的Unicode支持:

>>> 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 SOLUTION

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 

打印:

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

也是一個選項;請注意,您現在正在將'...'更改爲'..',但這可能適合您的需求。 –