使用`\w`表达式时,Python正则表达式支持NFKD Unicode中的重音符号

使用`\w`表达式时,Python正则表达式支持NFKD Unicode中的重音符号,python,regex,python-2.7,unicode,unicode-normalization,Python,Regex,Python 2.7,Unicode,Unicode Normalization,我试图使用Python2.7的正则表达式模块来匹配NFKD规范化Unicode字符串中的所有单词。我的理解是,re.UNICODE标志为\w表达式添加了UNICODE支持,但我在这方面没有取得任何成功 >>> s = u'ca\u0308t' >>> print s cät >>> pattern = re.compile(ur'\w+', flags=re.UNICODE) >>> pattern.findall(s)

我试图使用Python2.7的正则表达式模块来匹配NFKD规范化Unicode字符串中的所有单词。我的理解是,
re.UNICODE
标志为
\w
表达式添加了UNICODE支持,但我在这方面没有取得任何成功

>>> s = u'ca\u0308t'
>>> print s
cät
>>> pattern = re.compile(ur'\w+', flags=re.UNICODE)
>>> pattern.findall(s)
[u'ca', u't']
我想这是因为
\u0308
不被视为字母数字,因此与
\w
不匹配。该模式与NFKC标准化Unicode匹配:

>>> s
u'ca\u0308t'
>>> import unicodedata 
>>> r = unicodedata.normalize('NFKC', s)
>>> pattern.findall(r)
[u'c\xe4t']

如果使用<代码> R.Unicode 将使分析器考虑<代码> \U0661 \U0308< /Code >,相当于 \U00 E4。有没有什么我做错了,或者没有意识到的

如果标准库中没有任何东西可以帮助我,我将只使用NFKC。谢谢大家!

有关Unicode规范化表单的信息:

编辑:我刚刚发现以前有人问过这个问题:


看起来最好的解决方案是使用而不是使用
re

您可以使用这个:
\S+

\S
-除空格外的所有字符

例如:

>>> re.compile(ur'\S+', flags=re.UNICODE).findall(u'ca\u0308t')
[u'ca\u0308t']

您可以使用以下命令:
\S+

\S
-除空格外的所有字符

例如:

>>> re.compile(ur'\S+', flags=re.UNICODE).findall(u'ca\u0308t')
[u'ca\u0308t']

为清晰起见,旁注:在我的代码示例中,我看到重音出现在
cat
中的
t
上,但它应该出现在
a
上,如
ä
中。编辑帖子时,重音出现在
a
上,这有点奇怪。在Unicode模式下,caU+0308t与标准
\w
匹配。其中U+063U+0308被视为一个字符。顺便说一句,为什么要将赋值用作参数
flags=re.UNICODE
?这可能只返回1。用Python中的
re.UNICODE
@sln试试,您可以显式地为参数分配参数。此处
flags
是参数的名称。我可以只使用
re.UNICODE
,得到相同的结果。关于你的第一条评论,这是我期望的行为,但不是我观察到的行为。我在boost中尝试过,它在Unicode模式下工作。您是否尝试过替换引擎
regex
而不是
re
?为了清晰起见,旁注:在我的代码示例中,我看到重音出现在
cat
中的
t
上,但它应该出现在
a
上,如
a
中。编辑帖子时,重音出现在
a
上,这有点奇怪。在Unicode模式下,caU+0308t与标准
\w
匹配。其中U+063U+0308被视为一个字符。顺便说一句,为什么要将赋值用作参数
flags=re.UNICODE
?这可能只返回1。用Python中的
re.UNICODE
@sln试试,您可以显式地为参数分配参数。此处
flags
是参数的名称。我可以只使用
re.UNICODE
,得到相同的结果。关于你的第一条评论,这是我期望的行为,但不是我观察到的行为。我在boost中尝试过,它在Unicode模式下工作。您是否尝试过更换引擎
regex
而不是
re
?感谢您的回复。不幸的是,我使用的是自然语言,不能假设空白是字母数字文本的完美反义词。例如,从
“cät我只想捕获
cät
。事实上,我正试图让其他人的代码使用规范化的Unicode。给我带来麻烦的表达式是
re.compile(r'[\w\-\\\\\\\\\\\/&]+',re.UNICODE)
。所以我想捕捉一些标点符号,但大部分都应该扔掉。谢谢你的回复。不幸的是,我使用的是自然语言,不能假设空白是字母数字文本的完美反义词。例如,从
“cät我只想捕获
cät
。事实上,我正试图让其他人的代码使用规范化的Unicode。给我带来麻烦的表达式是
re.compile(r'[\w\-\\\\\\\\\\\/&]+',re.UNICODE)
。所以我想捕捉一些标点符号,但大部分都应该扔掉。