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

4

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

anubhava,我想指出字符串1和字符串2(这不是程序代码)。 - Gooman
2个回答

3

regexp1 是一个不错的起点。问题在于 regexp1 匹配至少包含一个字母的字符串,而不是只包含字母的字符串。请尝试使用以下正则表达式:

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

这个“锚定”了匹配模式既到字符串的开头又到结尾,这意味着它不能仅匹配“New / York”中的“New”部分。

Python的re模块似乎不支持像\p{L}这样的字符类,但有一个第三方regex模块可以支持。请参阅https://pypi.python.org/pypi/regex/中的文档。但我无法保证此模块的性能或符合标准程度。


谢谢,它有效!我希望它也能帮助其他正在寻找在Python中使用\p{L}的人。 - Gooman

2

re文档中推荐使用第三方regex模块,以获得更多功能和更好的Unicode支持。特别是,它支持\p模式,因此

\p{L}+

应该可以很好地与regex正则表达式配合使用,匹配任何Unicode字母字符序列。

然而,您应该谨慎 - 合并变音符号不是字母。您可以更改您的正则表达式以接受组合标记,或将输入规范化为NFC形式,将一些组合标记组合到前面的字母中,但首先,您应该非常仔细地考虑“仅包含字母”的定义。

此外,search仅检查字符串是否包含与正则表达式匹配的内容,而不是整个字符串是否匹配正则表达式。我建议使用fullmatch来匹配整个字符串,但这只适用于Python 3.4+。对于2.7,我建议锚定正则表达式:

^\p{L}+$

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


\p{L} throw an error error: bad escape \p when using re but with regex works fun but still ot's not give the same results like in JavaScript - Walid Bousseta

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接