我试图了解如何在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 :(得分: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}+$
除了$
可以在尾随换行符之前匹配,因此您仍应检查匹配对象以查看它是否表示整个字符串匹配,或者它是否在尾随换行符之前停止。