匹配所有utf-8/unicode小写字母形式的正确正则表达式是什么

28 投票
4 回答
9694 浏览
提问于 2025-04-16 13:11

我想要匹配拉丁字母区的所有小写字母。简单的'[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 个回答

5

你可以看看这个网站 regular-expressions.info

不过,按照我所知道的,没有一个字符类别或者修饰符可以单独表示“只有小写字母”(而且并不是所有语言都有小写字母),所以我觉得你可能需要使用多个范围(几乎可能和unicode块的数量一样多)。

编辑:再多读了一些,似乎有一种方法:[\p{Ll}\p{Lo}],这表示小写字母和没有大小写变体的字符(比如中文字符)。

正则表达式 [\p{Ll}\p{Lo}]+ 可以匹配测试字符串 àÀhelloHello你好Прывітанне,用 x 替换匹配的部分后,结果是 xÀxHxПx,而用 [\p{Ll}]+ 替换匹配的部分后,结果是 xÀxHx你好Пx(注意到中文字符没有被匹配到)。

8

看起来这个在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')

现在仍然适用。

14

目前,Python 的正则表达式不支持 Unicode 属性。如果你想了解更多,可以查看 这个回答,里面有一个链接到 Ponyguruma 库,这个库是支持 Unicode 属性的。

使用这样的库,你可以用 \p{Ll} 来匹配 Unicode 字符串中的任何小写字母。

在 Unicode 标准中,每个字符都属于一个特定的类别。\p{Ll} 是小写字母的类别,而 \p{L} 则包含所有属于“字母”类别的字符(包括大写字母、小写字母、标题字母、修饰字母和其他字母)。想了解更多,可以查看 Unicode 标准 的字符属性章节。或者可以访问 这个页面,那里对正则表达式中使用 Unicode 的解释很不错。

撰写回答