2017-08-28 43 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}+$ 

除了$可以在换行符之前正确的比赛,所以你还是应该检查匹配对象,看它是否代表了整个字符串匹配,或者如果它在换行符之前停止。

相关问题