2012-09-06 24 views
1

含有平假名和片假名Unicode字符的样本串:为什么这个Python RegEx管道没有选出两个unicode范围?

myString = u"Eliminate ひらがな non-alphabetic カタカナ characters" 

模式匹配两个范围,根据: http://www.rikai.com/library/kanjitables/kanji_codes.unicode.shtml

myPattern = u"[\u3041-\u309f]*|[\u30a0-\u30ff]*" 

简单的Python正则表达式替换功能

import re 
print re.sub(myPattern, "", myString) 

退货:

Eliminate non-alphabetic カタカナ characters 

我能得到它的唯一方法是如果我分别使用两个范围,一个接一个。什么是阻止这个RegEx简单地选择| -pipe的两侧?

回答

5

你需要的范围内组合成一个字符类,否则将匹配一个或另一个范围,而不是两个:

myPattern = u"[\u3041-\u309f\u30a0-\u30ff]*" 

演示:

>>> myPattern = u"[\u3041-\u309f\u30a0-\u30ff]*" 
>>> print re.sub(myPattern, "", u"Eliminate ひらがな non-alphabetic カタカナ characters") 
Eliminate non-alphabetic characters 
0
>>> myPattern = u"[\u3041-\u309f]|[\u30a0-\u30ff]" 
>>> print re.sub(myPattern, "", myString) 
Eliminate non-alphabetic characters 
>>> 

编辑你可以结合两个字符类与OR运算符以及

+0

但它会更慢(虽然不多),而且比单个类更冗长。 – tripleee

相关问题