首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python 2.7: regex -匹配任何语言中的任何字母

Python 2.7: regex -匹配任何语言中的任何字母
EN

Stack Overflow用户
提问于 2017-08-28 17:15:41
回答 2查看 1.3K关注 0票数 4

我试图了解如何检查字符串是否只包含(来自任何语言)。我试过这样的代码:

代码语言:javascript
复制
# -*- 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()

输出:

代码语言:javascript
复制
('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} regex,但是它根本不起作用。我试过这样的方法:[\p{L}]+(\p{L})+\p{L}

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-08-28 17:20:43

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

代码语言:javascript
复制
regexp1 = re.compile('^[^\W\d_]+$', re.IGNORECASE | re.UNICODE)

这“锚定”匹配的开始和结束的字符串,这意味着它将不能仅仅匹配“纽约/纽约”的“新”部分。

python re模块似乎不支持像\p{L}这样的字符类,但是有一个第三方regex模块。但是,请参阅https://pypi.python.org/pypi/regex/的文档,但我不能讨论该模块的性能或标准--遵从性。

票数 3
EN

Stack Overflow用户

发布于 2017-08-28 17:23:43

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

代码语言:javascript
复制
\p{L}+

应该可以很好地处理regex正则表达式,匹配任意序列的Unicode字母字符。

然而,你应该小心谨慎--一个组合的暗号不是字母。您可以修改正则表达式以接受组合标记,也可以将NFC形式的输入规范化,以便将一些组合标记组合到前面的字母中,但首先,您应该非常仔细地考虑“只包含字母”的定义。

另外,search只检查字符串是否包含正则表达式的匹配项,而不是整个字符串是否与regex匹配。我建议使用fullmatch来匹配整个字符串,但这仅限于Python 3.4+。至于2.7,我要说的是锚定要塞:

代码语言:javascript
复制
^\p{L}+$

除了$可以在尾随换行符之前匹配之外,您还应该检查match对象,以确定它是否代表整个字符串匹配,还是在尾随换行符之前停止。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45924230

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档