带有ØÆÅ字母的Python正则表达式

boj*_*oje 2 python regex encoding python-2.x

我是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
Run Code Online (Sandbox Code Playgroud)

我现在得到的结果是:

Phone Num : ånd ånd ååååånd dd flløde... :)asd 
Run Code Online (Sandbox Code Playgroud)

我想要的是:

Phone Num : ånd ånd åånd dd flløde... :)asd 
Run Code Online (Sandbox Code Playgroud)

Mar*_*ers 5

您需要使用Unicode值,而不是字节字符串.UTF-8编码å两个字节,正则表达式匹配\w 在默认的非Unicode感知模式下操作时匹配ascii字母,数字和下划线.

re模块文档\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 
Run Code Online (Sandbox Code Playgroud)

因为å没有被识别为字母数字:

>>> print re.sub(ur'\w', '', text, re.UNICODE)
å å ååååå  ø... :) 
Run Code Online (Sandbox Code Playgroud)

解决方案是使用外部regex,它是的一个版本,re可以添加适当的完整Unicode支持:

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

该模块不仅可以识别Unicode值中的更多字母数字字符,还可以查看链接的包页面以获取更多详细信息.