在ply的正则表达式中匹配unicode

时间:2008-10-26 16:35:08

标签: python regex unicode ply character-properties

我正在匹配标识符,但现在我遇到了问题:我的标识符允许包含unicode字符。因此,旧的做事方式是不够的:

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

my markup language解析器中,我通过允许除我明确使用的字符之外的所有字符来匹配unicode字符,因为我的标记语言只有两个或三个字符,我需要以这种方式转义。

如何将所有unicode字符与python正则表达式和ply匹配?这也是一个好主意吗?

我想让人们在他们的程序中使用像Ω»«°foo²väliπ这样的标识符作为标识符(变量名等)。哎呀!我希望人们可以用他们自己的语言编写程序,如果它是实用的!无论如何,unicode现在在各种各样的地方得到支持,它应该传播。

编辑:POSIX字符类似乎没有被python正则表达式识别。

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

编辑:更好地解释我需要的东西。我需要一个匹配所有unicode可打印字符的正则表达式,但根本不需要ASCII字符。

编辑:r“\ w”做了我想要的东西,但它与«»不匹配,而且我还需要一个与数字不匹配的正则表达式。

5 个答案:

答案 0 :(得分:5)

re模块支持\ w语法:

  

如果设置了UNICODE,则匹配   字符[0-9_]加上什么是   在...中分类为字母数字   Unicode字符属性数据库。

因此,以下示例显示了如何匹配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 *

答案 1 :(得分:3)

你需要在lex.lex中传递参数reflags:

lex.lex(reflags=re.UNICODE)

答案 2 :(得分:1)

检查此问题的答案

Stripping non printable characters from a string in python

您只需要使用其他unicode字符类别

答案 3 :(得分: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支持..这是一个丑陋的黑客,而不是一个令人满意的解决方案。

答案 4 :(得分:0)

可能POSIX character classes适合你吗?