2012-09-06 55 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

相關問題