2017-08-28 41 views
3

我試圖瞭解如何檢查在Python 2.7中,字符串是否只包含字母(來自任何語言)。我曾嘗試這樣的代碼:Python 2.7:正則表達式 - 匹配任何語言的任何字母

# -*- coding: utf-8 -*- 
import re 

def main(): 
    regexp1 = re.compile('[^\W\d_]+', re.IGNORECASE | re.UNICODE) 
    regexp2 = re.compile('[\p{L}]+', re.IGNORECASE | re.UNICODE) 

    print("1", regexp1.search(u"test")) 
    print("2", regexp1.search(u'äö')) 
    print("3", regexp1.search(u'...')) 
    print("4", regexp1.search(u'9a')) 
    print("5", regexp1.search(u'New/York')) 

    print("6", regexp2.search(u"test")) 
    print("7", regexp2.search(u'äö')) 
    print("8", regexp2.search(u'...')) 
    print("9", regexp2.search(u'9a')) 
    print("10", regexp2.search(u'New/York')) 

if __name__ == '__main__': 
    main() 

輸出:

('1', <_sre.SRE_Match object at 0x02ACF678>) 
('2', <_sre.SRE_Match object at 0x02ACF678>) 
('3', None) 
('4', <_sre.SRE_Match object at 0x02ACF678>) 
('5', <_sre.SRE_Match object at 0x02ACF678>) 
('1', None) 
('2', None) 
('3', None) 
('4', None) 
('5', None) 

我想一個正則表達式,將(從任何語言只能用字母串)只匹配字符串№1和字符串№2。但現在它匹配包含字母的字符串(並且還包含數字和/)​​。

此外,我試圖使用\p{L}正則表達式,但它根本不起作用。我試過這個正則表達式:[\p{L}]+,(\p{L})+,\p{L}

+0

anubhava,我只想指出數字1的字符串和數字2的字符串(它不是程序代碼)。 – Gooman

回答

3

regexp1是一個好的開始。問題是regexp1匹配包含至少一個字母的字符串,而不是僅包含字母的字符串。試試這個:

regexp1 = re.compile('^[^\W\d_]+$', re.IGNORECASE | re.UNICODE) 

這個「錨」比賽既開頭和字符串的結尾,這意味着它不能只是滿足「新建/紐約」的「新」的一部分。

蟒蛇re模塊似乎沒有任何支持字符類如\p{L},但有一個第三方regex模塊。請參閱文檔https://pypi.python.org/pypi/regex/但是,我無法說出該模塊的性能或符合標準。

+0

謝謝,它的工作原理!我希望它也能幫助其他人在Python中尋找\ p {L}。 – Gooman

1

re文檔中建議使用第三方regex module以獲得更多功能和更好的Unicode支持。特別是,它支持\p圖案,讓

\p{L}+ 

能很好地工作regex正則表達式匹配的Unicode的字母文字的任何序列。

但是,你應該謹慎 - 一個組合變音不是一封信。你可以改變你的正則表達式來接受組合標記,或者用NFC形式標準化你的輸入,把一些組合標記合併到前面的字母中,但首先,你應該仔細考慮你對「只包含字母」的定義。

此外,search僅檢查字符串是否包含匹配的正則表達式,而不是是否整個字符串正則表達式匹配。我會推薦fullmatch來匹配整個字符串,但這只是在Python 3.4+中。對於2.7,我想說的錨定的正則表達式:

^\p{L}+$ 

除了$可以在換行符之前正確的比賽,所以你還是應該檢查匹配對象,看它是否代表了整個字符串匹配,或者如果它在換行符之前停止。

相關問題