2008-10-26 134 views
4

我正在匹配標識符,但現在我遇到了一個問題:我的標識符允許包含unicode字符。因此,舊的方式來做事是不夠的:匹配正則表達式中的unicode

t_IDENTIFIER = r"[A-Za-z](\\.|[A-Za-z_0-9])*" 

my markup language解析器我允許,除了那些我明確地使用所有的字符的Unicode字符匹配,因爲我的標記語言,只有兩個或三個大字,我需要這樣逃跑。

如何使用python正則表達式和ply匹配所有的unicode字符?這也是一個好主意嗎?

我想讓人們使用像Ω»«foo²väliπ這樣的標識符作爲程序中的標識符(變量名稱等)。哎呀!我希望人們可以用自己的語言編寫程序,只要它很實用!無論如何,Unicode現在支持各種各樣的地方,它應該傳播。

編輯:POSIX字符類似乎不被python正則表達式識別。

>>> import re 
>>> item = re.compile(r'[[:word:]]') 
>>> print item.match('e') 
None 

編輯:爲了更好地解釋我需要的東西。我需要一個正則表達式,它匹配所有的unicode可打印字符,但不包含ASCII字符。

編輯:r「\ w」做了我想要的東西,但它不符合«»,我還需要一個不匹配數字的正則表達式。

+0

它也不會出現Python的PCRE理解謂語類兩種:\ p {} ISALPHA他們 – Axeman 2008-10-27 03:37:49

回答

5

re模塊支持\ W語法其中:

如果UNICODE被設置,這將在 字符[0-9_]加上無論是 分類爲 Unicode字符屬性數據庫字母數字匹配。

因此下面的例子說明如何搭配統一標識符:

>>> import re 
>>> m = re.compile('(?u)[^\W0-9]\w*') 
>>> m.match('a') 
<_sre.SRE_Match object at 0xb7d75410> 
>>> m.match('9') 
>>> m.match('ab') 
<_sre.SRE_Match object at 0xb7c258e0> 
>>> m.match('a9') 
<_sre.SRE_Match object at 0xb7d75410> 
>>> m.match('unicöde') 
<_sre.SRE_Match object at 0xb7c258e0> 
>>> m.match('ödipus') 
<_sre.SRE_Match object at 0xb7d75410> 

所以您要查找的表達式爲:(?U)[^ \ W0-9] \ W *

+0

現在。這是一個滿意的解決方案! – Cheery 2008-10-26 21:22:00

1

與Vinko的幫助下解決了這個問題。

我意識到獲得unicode範圍是愚蠢的。所以我會這樣做:

symbols = re.escape(''.join([chr(i) for i in xrange(33, 127) if not chr(i).isalnum()])) 
symnums = re.escape(''.join([chr(i) for i in xrange(33, 127) if not chr(i).isalnum()])) 

t_IDENTIFIER = "[^%s](\\.|[^%s])*" % (symnums, symbols) 

我不知道unicode字符分類。如果這個unicode的東西開始變得太複雜,我可以把原來的東西放在適當的位置。 UTF-8支持仍然確保支持在STRING令牌上,這是更重要的。

編輯:另一方面,我開始理解爲什麼在編程語言中沒有太多的Unicode支持。這是一個醜陋的黑客,而不是一個令人滿意的解決方案。

3

你需要通過通參數reflags在lex.lex:

lex.lex(reflags=re.UNICODE)