Python 正则表达式中的Umlauts匹配(通过区域设置?)

Python 正则表达式中的Umlauts匹配(通过区域设置?),python,regex,locale,Python,Regex,Locale,我很惊讶我不能在regexp中与德国的umlaut相媲美。我尝试了几种方法,大多数都涉及设置区域设置,但到目前为止都没有效果 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

我很惊讶我不能在regexp中与德国的umlaut相媲美。我尝试了几种方法,大多数都涉及设置区域设置,但到目前为止都没有效果

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)
这些版本都没有将umlaut-u(ü)与
\w+
正确匹配。另外,删除
re.L
标志或在模式字符串前面加上
u
(使其成为unicode)对我也没有帮助


有什么想法吗?如何正确使用标志
re.L

您是否尝试使用
re.UNICODE
标志,如中所述

快速搜索指向此点,并给出一些解释:

LOCALE只是将字符传递给底层C库。信息技术 实际上,它只适用于每个字符有1个字节的bytestring。UTF-8 将ASCII范围之外的代码点编码为每个字节数 代码点,并且re模块将把这些字节中的每一个作为 单独字符


在我的例子中,
\S
给了我比
\w
更好的结果,加上将文件保存为utf-8,再加上使用
re.UNICODE

不,我没有(我错了),我不知道该标志的存在,它解决了我的问题!谢谢,我很快会将此标记为已接受的答案(除非一个更详细的答案也会解释为什么我仅使用区域设置标记的试验没有按预期工作。如果您使用的是Python 2,请使用Unicode字符串(u“…”)。制作脚本UTF-8是一个好主意。忘记
LOCALE
标志,将其视为仅用于遗留内容(当您没有其他选择时)。是的,我在发布我的问题之前阅读了这句话。然而,奇怪的是,“底层C库”很难接受umlaut作为单词字符(
\w
).但是,这似乎把问题从Python转移到了C库,而C库实际上不是我关心的问题,因为我有
re.U
的解决方案。谢谢你!我认为这个臭名昭著的re.LOCALE标志应该从文档中删除,永远不要提及。这是一个假的、虚伪的东西,对C来说是一个陷阱可能是在你的情况下,但通常情况下,
\S
也会匹配标点符号和特殊字符(例如。♯ 或→ 或者类似的),这不是我需要的。
>>> re.findall(r'\w+', 'abc def güi jkl', re.UNICODE)
['abc', 'def', 'g\xc3\xbci', 'jkl']