用于unicode大写单词的Python正则表达式



我有一组不同语言的单词(英语、波兰语、芬兰语、俄语等),需要检查,其中哪些单词是用大写字母写的。

我尝试使用简单的正则表达式:^[A-Z],但它只匹配拉丁字母,然后我添加了俄语大写字母:^[A-ZА-Я]

但是许多带有变音符号的unicode字母仍然存在。如何将所有大写字母添加到正则表达式中?

不需要列举符号就可以做到这一点吗?

附言:我知道,如何用Ruby做这个,但现在我用的是Python。

如果您需要使用正则表达式,您有两个选项:

  • 安装PyPi regex模块并使用p{Lu}[[:upper:]](其中包含更多大写字符)类(确保安装了最新版本)
  • re与包含所有大写字母范围的字符类一起使用,可以使用Python实用程序(然后匹配的Unicode字母数量将取决于Python版本,最新版本具有最新数据),也可以从Unicode实用程序CLDR页面手动创建/更新范围

以下是一个包含所有大写字母范围的正则表达式的解决方案,该正则表达式取自Unicode实用程序CLDR参考页:

import re
pLu = "[A-Zu00C0-u00D6u00D8-u00DEu0100u0102u0104u0106u0108u010Au010Cu010Eu0110u0112u0114u0116u0118u011Au011Cu011Eu0120u0122u0124u0126u0128u012Au012Cu012Eu0130u0132u0134u0136u0139u013Bu013Du013Fu0141u0143u0145u0147u014Au014Cu014Eu0150u0152u0154u0156u0158u015Au015Cu015Eu0160u0162u0164u0166u0168u016Au016Cu016Eu0170u0172u0174u0176u0178u0179u017Bu017Du0181u0182u0184u0186u0187u0189-u018Bu018E-u0191u0193u0194u0196-u0198u019Cu019Du019Fu01A0u01A2u01A4u01A6u01A7u01A9u01ACu01AEu01AFu01B1-u01B3u01B5u01B7u01B8u01BCu01C4u01C7u01CAu01CDu01CFu01D1u01D3u01D5u01D7u01D9u01DBu01DEu01E0u01E2u01E4u01E6u01E8u01EAu01ECu01EEu01F1u01F4u01F6-u01F8u01FAu01FCu01FEu0200u0202u0204u0206u0208u020Au020Cu020Eu0210u0212u0214u0216u0218u021Au021Cu021Eu0220u0222u0224u0226u0228u022Au022Cu022Eu0230u0232u023Au023Bu023Du023Eu0241u0243-u0246u0248u024Au024Cu024Eu0370u0372u0376u037Fu0386u0388-u038Au038Cu038Eu038Fu0391-u03A1u03A3-u03ABu03CFu03D2-u03D4u03D8u03DAu03DCu03DEu03E0u03E2u03E4u03E6u03E8u03EAu03ECu03EEu03F4u03F7u03F9u03FAu03FD-u042Fu0460u0462u0464u0466u0468u046Au046Cu046Eu0470u0472u0474u0476u0478u047Au047Cu047Eu0480u048Au048Cu048Eu0490u0492u0494u0496u0498u049Au049Cu049Eu04A0u04A2u04A4u04A6u04A8u04AAu04ACu04AEu04B0u04B2u04B4u04B6u04B8u04BAu04BCu04BEu04C0u04C1u04C3u04C5u04C7u04C9u04CBu04CDu04D0u04D2u04D4u04D6u04D8u04DAu04DCu04DEu04E0u04E2u04E4u04E6u04E8u04EAu04ECu04EEu04F0u04F2u04F4u04F6u04F8u04FAu04FCu04FEu0500u0502u0504u0506u0508u050Au050Cu050Eu0510u0512u0514u0516u0518u051Au051Cu051Eu0520u0522u0524u0526u0528u052Au052Cu052Eu0531-u0556u10A0-u10C5u10C7u10CDu13A0-u13F5u1E00u1E02u1E04u1E06u1E08u1E0Au1E0Cu1E0Eu1E10u1E12u1E14u1E16u1E18u1E1Au1E1Cu1E1Eu1E20u1E22u1E24u1E26u1E28u1E2Au1E2Cu1E2Eu1E30u1E32u1E34u1E36u1E38u1E3Au1E3Cu1E3Eu1E40u1E42u1E44u1E46u1E48u1E4Au1E4Cu1E4Eu1E50u1E52u1E54u1E56u1E58u1E5Au1E5Cu1E5Eu1E60u1E62u1E64u1E66u1E68u1E6Au1E6Cu1E6Eu1E70u1E72u1E74u1E76u1E78u1E7Au1E7Cu1E7Eu1E80u1E82u1E84u1E86u1E88u1E8Au1E8Cu1E8Eu1E90u1E92u1E94u1E9Eu1EA0u1EA2u1EA4u1EA6u1EA8u1EAAu1EACu1EAEu1EB0u1EB2u1EB4u1EB6u1EB8u1EBAu1EBCu1EBEu1EC0u1EC2u1EC4u1EC6u1EC8u1ECAu1ECCu1ECEu1ED0u1ED2u1ED4u1ED6u1ED8u1EDAu1EDCu1EDEu1EE0u1EE2u1EE4u1EE6u1EE8u1EEAu1EECu1EEEu1EF0u1EF2u1EF4u1EF6u1EF8u1EFAu1EFCu1EFEu1F08-u1F0Fu1F18-u1F1Du1F28-u1F2Fu1F38-u1F3Fu1F48-u1F4Du1F59u1F5Bu1F5Du1F5Fu1F68-u1F6Fu1FB8-u1FBBu1FC8-u1FCBu1FD8-u1FDBu1FE8-u1FECu1FF8-u1FFBu2102u2107u210B-u210Du2110-u2112u2115u2119-u211Du2124u2126u2128u212A-u212Du2130-u2133u213Eu213Fu2145u2160-u216Fu2183u24B6-u24CFu2C00-u2C2Eu2C60u2C62-u2C64u2C67u2C69u2C6Bu2C6D-u2C70u2C72u2C75u2C7E-u2C80u2C82u2C84u2C86u2C88u2C8Au2C8Cu2C8Eu2C90u2C92u2C94u2C96u2C98u2C9Au2C9Cu2C9Eu2CA0u2CA2u2CA4u2CA6u2CA8u2CAAu2CACu2CAEu2CB0u2CB2u2CB4u2CB6u2CB8u2CBAu2CBCu2CBEu2CC0u2CC2u2CC4u2CC6u2CC8u2CCAu2CCCu2CCEu2CD0u2CD2u2CD4u2CD6u2CD8u2CDAu2CDCu2CDEu2CE0u2CE2u2CEBu2CEDu2CF2uA640uA642uA644uA646uA648uA64AuA64CuA64EuA650uA652uA654uA656uA658uA65AuA65CuA65EuA660uA662uA664uA666uA668uA66AuA66CuA680uA682uA684uA686uA688uA68AuA68CuA68EuA690uA692uA694uA696uA698uA69AuA722uA724uA726uA728uA72AuA72CuA72EuA732uA734uA736uA738uA73AuA73CuA73EuA740uA742uA744uA746uA748uA74AuA74CuA74EuA750uA752uA754uA756uA758uA75AuA75CuA75EuA760uA762uA764uA766uA768uA76AuA76CuA76EuA779uA77BuA77DuA77EuA780uA782uA784uA786uA78BuA78DuA790uA792uA796uA798uA79AuA79CuA79EuA7A0uA7A2uA7A4uA7A6uA7A8uA7AA-uA7AEuA7B0-uA7B4uA7B6uFF21-uFF3AU00010400-U00010427U000104B0-U000104D3U00010C80-U00010CB2U000118A0-U000118BFU0001D400-U0001D419U0001D434-U0001D44DU0001D468-U0001D481U0001D49CU0001D49EU0001D49FU0001D4A2U0001D4A5U0001D4A6U0001D4A9-U0001D4ACU0001D4AE-U0001D4B5U0001D4D0-U0001D4E9U0001D504U0001D505U0001D507-U0001D50AU0001D50D-U0001D514U0001D516-U0001D51CU0001D538U0001D539U0001D53B-U0001D53EU0001D540-U0001D544U0001D546U0001D54A-U0001D550U0001D56C-U0001D585U0001D5A0-U0001D5B9U0001D5D4-U0001D5EDU0001D608-U0001D621U0001D63C-U0001D655U0001D670-U0001D689U0001D6A8-U0001D6C0U0001D6E2-U0001D6FAU0001D71C-U0001D734U0001D756-U0001D76EU0001D790-U0001D7A8U0001D7CAU0001E900-U0001E921U0001F130-U0001F149U0001F150-U0001F169U0001F170-U0001F189]"
p = re.compile(pLu)
if p.match("Żółw"):
    print("Capitalized!")

请参阅IDEONE演示。要使其在Python2.x中工作,请确保在字符串文字中添加u前缀。

还有其他方法可以使用unicodedatasys包(如)在Python中获得Unicode大写字母字符类

# Python 3
pLu = '[{}]'.format("".join([chr(i) for i in range(sys.maxunicode) if chr(i).isupper()]))
# Python 2
pLu = u'[{}]'.format(u"".join([unichr(i) for i in xrange(sys.maxunicode) if unichr(i).isupper()]))

但是,此范围与[:upper:] POSIX字符类的Unicode实用程序:UnicodeSet页面上显示的所有大写字母不匹配。

参见:

  • Python 2.7 len([unichr(i) for i in xrange(sys.maxunicode) if unichr(i).isupper()])显示1427
  • Python 3.5 len([chr(i) for i in range(sys.maxunicode) if chr(i).isupper()])显示1751
  • Python 3.6 len([chr(i) for i in range(sys.maxunicode) if chr(i).isupper()])显示1822
  • 当前的Unicode实用程序CLDR页面为[:upper:]类显示1,822大写字母,为p{Lu}显示1,702大写字母

使用PyPi regex模块,它更简单:

import regex
p = regex.compile(r"p{Lu}") # To support (currently) 1702 uppercase letters
# p = regex.compile(r"[[:upper:]]") # To support (currently) 1822 uppercase letters
if p.match("Żółw"):
    print("Capitalized!")

在Python2.x中,您应该使用:

p = regex.compile(ur"p{Lu}")
p = regex.compile(ur"[[:upper:]]")

p = regex.compile(r"p{Lu}", regex.U)
p = regex.compile(r"[[:upper:]]", regex.U)

re在您可以只使用word[0].isupper()的情况下是多余的。

>>>> 'żółć'[0].isupper()
False
>>>> 'Żółw'[0].isupper()
True
>>>> 'ćMa'[0].isupper()
False
>>> words
'Does not match Äh Oh Äi Üs üx Öjjj'
>>> re.findall(r"(b[A-ZÜÖÄ][a-z.-]+b)", words, re.UNICODE)
['Does', 'Äh', 'Oh', 'Äi', 'Üs', 'Öjjj']

只需将所有不在A-Z范围内的Unicode字母添加到列表中,我只添加了德语元音变音符。

你可以找到像这样的所有非ASCII字母(A-Z):

>>> [c for c in words if not c.isalpha() and not c.isdigit() and not c.isspace()]
['xc3', 'x84', 'xc3', 'x84', 'xc3', 'x9c', 'xc3', 'xbc', 'xc3', 'x96']

现在你必须弄清楚哪些是大写字母。

您可以将字符串与其大写版本进行比较,以判断其是否大写:

>>>> s = 'żółć Żółw ćMa'
>>>> l = s.split()
>>>> [word for word in l if word == word.capitalize()]
['Żółw']
>>>> frozenset(l).intersection(s.capitalize() for s in l)
frozenset({'Żółw'})

请注意,在Python2中,您需要使用unicode字符串才能使其正常工作。

您应该尝试Ww:

pythex.org中的示例