Mac OS X 终端中使用 Python 正则表达式处理 ÅÄÖ (utf-8)
我正在尝试用 re.split 来分割一个包含瑞典字符的字符串,但代码就是不管用。
wordsre = re.compile(r"[\WåäöÅÄÖ]+")
mytext = "hej. och gå! Med en #katt som leker 9 liv!"
newtext = wordsre.split(mytext)
输出结果是:
['hej', 'och', 'g', 'Med', 'en', 'katt', 'som', 'leker', '9', 'liv', '']
编辑:第三个词应该是“gå”。但是瑞典字符“å”缺失了。
我在使用 Mac OS X Mavericks,Python 3.4,并且在终端(Bash)中运行“locale”命令的输出是:
LANG="sv_SE.UTF-8"
LC_COLLATE="sv_SE.UTF-8"
LC_CTYPE="sv_SE.UTF-8"
LC_MESSAGES="sv_SE.UTF-8"
LC_MONETARY="sv_SE.UTF-8"
LC_NUMERIC="sv_SE.UTF-8"
LC_TIME="sv_SE.UTF-8"
LC_ALL=
我在 Ubuntu 论坛上找到这个讨论,但我看不出为什么它在我这里不工作,尽管地区设置是正确的。
3 个回答
3
你在分割字符的时候把 å
包含进去了。看起来你对分割的功能有些误解。
re.split()
会根据你指定的字符来分割单词;在你的例子中,\W
匹配的是任何不是字母、数字或 _
的东西,而你又把字符 åÅäÄöÖ
加入了这个集合。
如果你不想让这些字符被分割,就去掉它们:
wordsre = re.compile(r"\W+")
在 Unicode 正则表达式中,这些字符本来就不属于 \W
字符集。
示例:
>>> import re
>>> mytext = "hej. och gå! Med en #katt som leker 9 liv!"
>>> wordsre = re.compile(r"\W+")
>>> wordsre.split(mytext)
['hej', 'och', 'gå', 'Med', 'en', 'katt', 'som', 'leker', '9', 'liv', '']
因为 \w
是 \W
的反义词,你也可以用 re.findall()
来代替 re.split()
,使用 \w
模式来提取单词,而不是去掉非单词字符:
>>> re.findall(r'\w+', mytext)
['hej', 'och', 'gå', 'Med', 'en', 'katt', 'som', 'leker', '9', 'liv']
这样做还有个好处,就是不会留下多余的空字符串。
再次强调,当使用 Unicode 模式时,所有 字母都会被包含在内,字符集并不仅限于 ASCII 字母。
0
小错误:使用 \w
,而不是 \W
这个代码可以正常工作:
[\wåäöÅÄÖ]+
在Python中:
print(re.findall(r"[\wåäöÅÄÖ]+","hej. och gå! Med en #katt som leker 9 liv!"))
输出结果:
['hej', 'och', 'gå', 'Med', 'en', 'katt', 'som', 'leker', '9', 'liv']
解释
\W
匹配的字符是那些不是字母、数字或下划线的字符,这正好和我们想要匹配的单词相反。- 在Python 2中,
\w
匹配的是ASCII字母、数字或下划线(除非你使用了re.UNICODE
这个选项,正如 @MartijnPieters 提到的)。 - 在Python 3中,
\w
匹配的是unicode字母、表意文字、数字或下划线(同样,除非你使用了re.ASCII
这个选项),所以带重音的字母就不需要了,\w+
就足够了。