Python字母数字unicode regex未按预期工作

2024-10-04 05:32:43 发布

您现在位置:Python中文网/ 问答频道 /正文

尝试编写一个python正则表达式来验证由

  • 任何unicode字母数字字符(包括组合字符)
  • 任意数量的空格字符
  • 任意数量的下划线
  • 任意数量的破折号
  • 任意数量的时段

我的测试字符串:

9 Melodía.de_la-montaña
9 Melodía.de_la-montaña

或作为使用ascii()生成的字符串文本:

^{pr2}$

它们看起来完全相同,但不是这样,一个是规范化的,另一个使用组合字符进行屈折。在

这是我的第一次尝试:

import re

reg = re.compile("^[\w\.\- ]+$", re.IGNORECASE)
re.search(reg, str1) # None
re.search(reg, str2) # None

如果我删除位置限定符并使用findall而不是search,我会得到这样的列表['9 Melodi', 'a.de_la-montan', 'a']或{}。在

我甚至尝试过re.compile("^[\w\.\- ]+$", re.IGNORECASE | re.UNICODE),但在python3中这应该是不必要的,对吧?在

在寻找答案的过程中,我发现了this questionthis one和{a3}和{a4},但它们都很旧,处理python2,似乎表明我编写的regex应该工作。python3.5regex文档提到\w应该匹配unicode,但是没有提供涉及非ASCII文本的实际示例。在

如何匹配所需的字符串?在


Tags: 字符串文本renonesearch数量unicodede
1条回答
网友
1楼 · 发布于 2024-10-04 05:32:43

您的第一个示例str1匹配得很好;\w包括所有Unicode单词字符,包括带重音符号的拉丁字符。在

可以使用^{}将字符串规范化为组合形式,使用NFC形式:

>>> import re
>>> import unicodedata
>>> str1 = '9 Melod\xeda.de_la-monta\xf1a'
>>> str2 = '9 Melodi\u0301a.de_la-montan\u0303a'
>>> reg = re.compile("^[\w\.\- ]+$")
>>> reg.search(str1)
<_sre.SRE_Match object; span=(0, 23), match='9 Melodía.de_la-montaña'>
>>> reg.search(str2) is None
True
>>> reg.search(unicodedata.normalize('NFC', str2))
<_sre.SRE_Match object; span=(0, 23), match='9 Melodía.de_la-montaña'>

注意,re.IGNORECASE标志不需要,\w不关心大小写。在

相关问题 更多 >