使用`\w`表达式时,Python正则表达式支持NFKD Unicode中的重音符号
我试图使用Python2.7的正则表达式模块来匹配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)
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
。有没有什么我做错了,或者没有意识到的
看起来最好的解决方案是使用而不是使用
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)
。所以我想捕捉一些标点符号,但大部分都应该扔掉。