2011-08-26 69 views
13

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

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

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

+0

我想不出逻辑的方式去这一点。大多数语言不匹配英文字母。例如,如果您尝试在日语中匹配'k',那么您将无法做到这一点。他们的语言只包含'ka''ki''ku'''''ko',但它们用符号表示,因此K不会与任何特定字符匹配。为了达到这个目的,你基本上需要采用一种语言并将其翻译成英文等同语言。所以如果你在日语中遇到“早上好”,你必须在进行正则表达式匹配之前把它翻译成“konnichiwa”。 – Tony318

+3

@ Tony318我碰巧有日语专业......这种方法在如此多的层面上是错误的...... – ty812

+3

http://stackoverflow.com/questions/2039140/python-re-how-doi-i-匹配字母字符 – Marty

回答

16

对于Python中的Unicode正则表达式的工作,我非常强烈地建议如下:

  • 使用Matthew Barnett’s regex library而不是标准re,这是不是真的适合Unicode的常规表达式。
  • 仅使用Python 3,从不使用Python 2.您希望所有字符串都是Unicode字符串。
  • 仅使用带有逻辑/抽象Unicode代码点的字符串文本,而不使用编码的字节字符串。
  • 在您的流上设置您的编码并忘记它。如果您发现自己曾经手动拨打.encode等,您几乎肯定会做错事。
  • 只使用宽码版本,其中的代码点和代码单元相同,从来都不是一个窄版本 - 您可能会考虑弃用Unicode强健性。
  • 将所有进入的字符串标准化为NFD,然后在出路上NFC。否则,你无法获得可靠的行为。
  • 一旦你这样做,你可以放心地编写模式,包括\w\p{script=Latin}\p{alpha}\p{lower}等,并知道这些都将做什么the Unicode Standard says they should。我详细解释了Python Unicode正则表达式业务的所有这些业务in this answer。短故事总是使用regex而不是re

    对于一般的Unicode建议,我还有关于Unicode正则表达式的several talks from last OSCON,其中大部分除了第三次谈话外不是Python,但其中大部分是可适应的。

    最后,总是有this answer将恐惧上帝(或至少是Unicode)放在心里。

    1

    建立您想要匹配的所有字符的匹配类。这很可能会变成非常大,非常大大。不,对于“所有汉字”没有正则表达式;)

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

    +0

    我没有意识到它会非常棘手......我将首先制作所有文本中字符的直方图我希望处理... – Baz

    +0

    这取决于正则表达式引擎。你可以在某些引擎的脚本属性上进行匹配,比如Perl可以选择汉字脚本(这些汉字是* Han *字符,即使它们也被日语使用,在那里称为汉字)。 – Joey

    +0

    当然,你可以为一个*脚本做一次 - 而不是在每一个*(同时)(我们不要在这里讨论汉/汉字问题......这是一个漫长而血腥的历史,不,很多字符不完全相似) – ty812

    4

    可以匹配

    \p{L} 
    

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

    +0

    对Ruby也有效:) – Aleksey

    7

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

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

    '\ w'还匹配数字'[0-9]'和下划线'_' – Toto

    +1

    非常好,这是标准Python库下的正确答案(尽管我自己总是使用Unicode文字)。请注意,根据[UTS#18](http://unicode.org/reports/tr18/#Categories),一个“字”charàla'\ w'包含Unicode 6.0中的102,724个代码点,并且任何GC = L (100,520),GC = M(1492),GC = Nd(420),GC = N1(224)或GC = Pc(10)码点。 Python的''re'有点过时了,所以没有跟上标准,但它很接近真实。如果您想完全匹配Unicode标准,则可以使用Matthew Barnett的'regex';它还提供'\ p {alpha}',这就是你想要的。 – tchrist

    +0

    @ M42:比这更复杂,但是。 Python的普通''re'库[对Unicode不好](http://stackoverflow.com/questions/7063420/perl-compatible-regular-expression-pcre-in-python/7066413#7066413),虽然它接近[ RL1.2a](http://unicode.org/reports/tr18/#Compatibility_Properties),但每个[RL1.2](http://unicode.org/reports/tr18/#Categories)缺少基本属性,每个属性的完整属性[RL2.7](http://www.unicode.org/reports/tr18/tr18-14.html#Full_Properties)。对于几乎任何使用Python的Unicode正则表达式,您应该使用Matthew Barnett的'regex'库。 – tchrist

    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)) 
    
    0

    对于葡萄牙语,使用试试这个:

    [a-zA-ZÀ-ú ]+ 
    
    相关问题