我试图了解如何检查字符串是否只包含(来自任何语言)。我试过这样的代码:
# -*- 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} regex,但是它根本不起作用。我试过这样的方法:[\p{L}]+,(\p{L})+,\p{L}。
发布于 2017-08-28 17:20:43
regexp1是一个很好的开始。问题是,regexp1匹配至少包含一个字母的字符串,而不是只包含字母的字符串。试试这个:
regexp1 = re.compile('^[^\W\d_]+$', re.IGNORECASE | re.UNICODE)这“锚定”匹配的开始和结束的字符串,这意味着它将不能仅仅匹配“纽约/纽约”的“新”部分。
python re模块似乎不支持像\p{L}这样的字符类,但是有一个第三方regex模块。但是,请参阅https://pypi.python.org/pypi/regex/的文档,但我不能讨论该模块的性能或标准--遵从性。
发布于 2017-08-28 17:23:43
为了获得更多的功能和更好的Unicode支持,建议在 module文档中使用第三方re。特别是,它支持\p模式,因此
\p{L}+应该可以很好地处理regex正则表达式,匹配任意序列的Unicode字母字符。
然而,你应该小心谨慎--一个组合的暗号不是字母。您可以修改正则表达式以接受组合标记,也可以将NFC形式的输入规范化,以便将一些组合标记组合到前面的字母中,但首先,您应该非常仔细地考虑“只包含字母”的定义。
另外,search只检查字符串是否包含正则表达式的匹配项,而不是整个字符串是否与regex匹配。我建议使用fullmatch来匹配整个字符串,但这仅限于Python 3.4+。至于2.7,我要说的是锚定要塞:
^\p{L}+$除了$可以在尾随换行符之前匹配之外,您还应该检查match对象,以确定它是否代表整个字符串匹配,还是在尾随换行符之前停止。
https://stackoverflow.com/questions/45924230
复制相似问题