2011-08-26 74 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À-ú ]+ 
    
    相關問題