Python 2.7:正则表达式 - 匹配任何语言的任何字母

时间:2017-08-28 17:15:41

标签: python regex

我试图了解如何在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}

2 个答案:

答案 0 :(得分:3)

regexp1是一个好的开始。问题是regexp1匹配包含至少一个字母的字符串,而不包含仅包含字母的字符串。试试这个:

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

这个&#34;锚点&#34;匹配字符串的开头和结尾,这意味着它不能匹配&#34; New&#34; &#34; New / York&#34;。

的一部分

python re模块似乎对\p{L}等字符类没有任何支持,但是有一个第三方regex模块可以支持。请参阅https://pypi.python.org/pypi/regex/处的文档。但是,我无法谈论该模块的性能或标准合规性。

答案 1 :(得分:1)

re文档中建议使用第三方regex module以获得更多功能和更好的Unicode支持。特别是,它支持\p模式,所以

\p{L}+

应与regex正则表达式配合使用,匹配任何Unicode字母字符序列。

但是,你应该谨慎 - 结合变音符不是一封信。您可以更改正则表达式以接受组合标记,或者以NFC形式标准化您的输入以将一些组合标记组合到前面的字母中,但首先,您应该仔细考虑您对“仅包含字母”的定义。

此外,search仅检查字符串是否包含匹配正则表达式,而不是整个字符串是否与正则表达式匹配。我建议fullmatch匹配整个字符串,但这只是在Python 3.4+中。对于2.7,我会说要锚定正则表达式:

^\p{L}+$

除了$可以在尾随换行符之前匹配,因此您仍应检查匹配对象以查看它是否表示整个字符串匹配,或者它是否在尾随换行符之前停止。