匹配任何语言的字母

时间:2011-08-26 14:48:27

标签: python regex unicode

如何在python 3中使用正则表达式匹配任何语言的字母?

re.match([a-zA-Z])将匹配英语字符,但我希望同时支持所有语言。

我不希望匹配'中的can't或下划线或任何其他类型的格式。我希望我的正则表达式匹配:cantÅé

7 个答案:

答案 0 :(得分:18)

对于Python中的Unicode正则表达式工作,我强烈推荐以下内容:

  1. 使用Matthew Barnett’s regex library代替标准re,这不适用于Unicode正则表达式。
  2. 仅使用Python 3,而不使用Python 2.您希望所有字符串都是Unicode字符串。
  3. 仅使用带有逻辑/抽象Unicode代码点的字符串文字,而不是编码字节字符串。
  4. 在您的流上设置您的编码并忘记它。如果您发现自己曾经手动拨打.encode等等,那么您几乎肯定会做错事。
  5. 只使用代码点和代码单元相同的宽版本,从来都不是一个狭窄的版本 - 您可以考虑将其弃用为Unicode健壮性。
  6. 在途中将所有传入的字符串规范化为NFD,然后在出路时将NFC规范化。否则你就无法获得可靠的行为。
  7. 执行此操作后,您可以安全地编写包含\w\p{script=Latin}\p{alpha}\p{lower}等的模式,并知道这些模式都会执行{{3 }}。我更详细地解释了Python Unicode正则表达式业务的所有这些业务the Unicode Standard says they should。简短的故事是始终使用regex而不是re

    对于一般的Unicode建议,我也有关于Unicode正则表达式的in this answer,除了第3次谈话之外,其中大多数不是关于Python的,但其中大部分都是适应性的。

    最后,始终several talks from last OSCON将恐惧上帝(或至少是Unicode)置于心中。

答案 1 :(得分:7)

使用\ w特殊序列有什么问题?

# -*- coding: utf-8 -*-
import re
test = u"can't, Å, é, and 中ABC"
print re.findall('\w+', test, re.UNICODE)

答案 2 :(得分:4)

你可以匹配

\p{L}

匹配任何代表脚本字母的Unicode代码点。也就是说,假设你实际上有一个支持Unicode的正则表达式引擎,我真的希望Python有这个引擎。

答案 3 :(得分:1)

构建您要匹配的所有字符的匹配类。这可能会变成非常非常大。不,“所有汉字”没有RegEx简写;)

也许更容易匹配你不想要的东西,但即使这样,这个类也会变得非常大。

答案 4 :(得分:1)

import re

text = "can't, Å, é, and 中ABC"
print(re.findall('\w+', text))

这适用于Python 3.但它也匹配下划线。然而,这似乎按照我的意愿完成了工作:

import regex

text = "can't, Å, é, and 中ABC _ sh_t"
print(regex.findall('\p{alpha}+', text))

答案 5 :(得分:0)

对于葡萄牙语,请尝试使用以下语言:

[a-zA-ZÀ-ú ]+

答案 6 :(得分:0)

正如其他人所指出的那样,要保持所有现有语言中所有字母的最新数据库是非常困难的。但是在大多数情况下,您实际上并不需要这样,并且只需要支持几种选定的语言并根据需要添加其他语言,就可以完美地编写代码。

以下简单代码支持匹配CzechGermanPolish语言。可以从维基百科轻松获得字符集。

import re

LANGS = [
    'ÁáČčĎďÉéĚěÍíŇňÓóŘřŠšŤťÚúŮůÝýŽž',   # Czech
    'ÄäÖöÜüẞß',                         # German
    'ĄąĆćĘꣳŃńÓ󌜏źŻż',               # Polish
    ]

pattern = '[A-Za-z{langs}]'.format(langs=''.join(LANGS))
pattern = re.compile(pattern)
result = pattern.findall('Žluťoučký kůň')

print(result)

# ['Ž', 'l', 'u', 'ť', 'o', 'u', 'č', 'k', 'ý', 'k', 'ů', 'ň']