English 中文(简体)
在Ply的正则表达式中匹配Unicode
原标题:
  • 时间:2008-10-26 16:35:07
  •  标签:

我正在匹配标识符,但现在遇到了一个问题:我的标识符允许包含Unicode字符。因此,以前的处理方式已经不足以满足需要:

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

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

我该如何使用Python的正则表达式和PLY匹配所有Unicode字符?同时,这个想法是否可行?

我希望人们可以在程序中使用诸如 Ω » « ° foo² väli π 这样的标识符(变量名等)。该死!如果实际可行,我希望人们可以用自己的语言编写程序!无论如何,现在 Unicode 在广泛的地方都得到支持,应该会推广开来。

编辑:Python正则表达式似乎无法识别POSIX字符类。

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

编辑:为了更好地解释我需要什么。我需要一个正则表达式-匹配所有Unicode可打印字符,但根本不匹配ASCII字符。

编辑:r"w"可以做我想要的一些事情,但它不匹配「」,我还需要一个不匹配数字的正则表达式。

最佳回答

re模块支持w语法,它:

If UNICODE is set, this will match the characters [0-9_] plus whatever is classified as alphanumeric in the Unicode character properties database.

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

问题回答

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

lex.lex(reflags=re.UNICODE)

请检查这个问题的答案。

在Python中从字符串中删除不可打印字符

你只需要使用其他 Unicode 字符类别。

在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支持...这是一种丑陋的破解,而不是满意的解决方案。

也许POSIX字符类适合您?





相关问题
热门标签