匹配所有utf-8/unicode小写字母形式的正确正则表达式是什么
我想要匹配拉丁字母区的所有小写字母。简单的'[a-z]'只匹配从U+0061到U+007A之间的字符,而不是所有其他的小写形式。
我希望能够匹配所有的小写字母,尤其是EFIGS语言中使用的所有带重音的小写字母。
[a-zà-ý]是一个开始,但还有很多其他的小写字符(可以查看http://www.unicode.org/charts/PDF/U0000.pdf)。有没有推荐的方法来做到这一点?
顺便说一下,我在使用Python,但我觉得这个问题在其他编程语言中也适用。
Python内置的"islower()"方法似乎可以正确检查:
lower = ''
for c in xrange(0,2**16):
if unichr(c).islower():
lower += unichr(c)
print lower
4 个回答
你可以看看这个网站 regular-expressions.info。
不过,按照我所知道的,没有一个字符类别或者修饰符可以单独表示“只有小写字母”(而且并不是所有语言都有小写字母),所以我觉得你可能需要使用多个范围(几乎可能和unicode块的数量一样多)。
编辑:再多读了一些,似乎有一种方法:[\p{Ll}\p{Lo}]
,这表示小写字母和没有大小写变体的字符(比如中文字符)。
正则表达式 [\p{Ll}\p{Lo}]+
可以匹配测试字符串 àÀhelloHello你好Прывітанне
,用 x
替换匹配的部分后,结果是 xÀxHxПx
,而用 [\p{Ll}]+
替换匹配的部分后,结果是 xÀxHx你好Пx
(注意到中文字符没有被匹配到)。
看起来这个在2005年发布的这个方法,
import sys, re
uppers = [u'[']
for i in xrange(sys.maxunicode):
c = unichr(i)
if c.isupper(): uppers.append(c)
uppers.append(u']')
uppers = u"".join(uppers)
uppers_re = re.compile(uppers)
print uppers_re.match('A')
现在仍然适用。
目前,Python 的正则表达式不支持 Unicode 属性。如果你想了解更多,可以查看 这个回答,里面有一个链接到 Ponyguruma 库,这个库是支持 Unicode 属性的。
使用这样的库,你可以用 \p{Ll}
来匹配 Unicode 字符串中的任何小写字母。
在 Unicode 标准中,每个字符都属于一个特定的类别。\p{Ll}
是小写字母的类别,而 \p{L}
则包含所有属于“字母”类别的字符(包括大写字母、小写字母、标题字母、修饰字母和其他字母)。想了解更多,可以查看 Unicode 标准 的字符属性章节。或者可以访问 这个页面,那里对正则表达式中使用 Unicode 的解释很不错。