我很惊讶我无法在正则表达式中匹配德国变音符号。我尝试了几种方法,大多数涉及设置区域设置,但到目前为止无济于事。
locale.setlocale(locale.LC_ALL, 'de_DE.UTF-8')
re.findall(r'\w+', 'abc def g\xfci jkl', re.L)
re.findall(r'\w+', 'abc def g\xc3\xbci jkl', re.L)
re.findall(r'\w+', 'abc def güi jkl', re.L)
re.findall(r'\w+', u'abc def güi jkl', re.L)
这些版本都没有与\w+
正确匹配umlaut-u(ü)。同时删除re.L
标志或使用u
为模式字符串添加前缀(使其成为unicode)对我没有帮助。
有什么想法吗?标志re.L
如何正确使用?
答案 0 :(得分:17)
您是否尝试使用re.UNICODE
标记,如doc中所述?
>>> re.findall(r'\w+', 'abc def güi jkl', re.UNICODE)
['abc', 'def', 'g\xc3\xbci', 'jkl']
快速搜索指向此thread,提供了一些解释:
re.LOCALE只是将角色传递给底层C库。它 实际上只适用于每个字符有1个字节的字节串。 UTF-8 将ASCII范围之外的代码点编码为每个字节数 代码点,re模块将每个字节视为一个 分开的角色。
答案 1 :(得分:0)
在我的情况下,\S
给了我比\w
更好的结果,并将文件保存为utf-8,再加上使用re.UNICODE