Mac OS X 终端中使用 Python 正则表达式处理 ÅÄÖ (utf-8)

1 投票
3 回答
1675 浏览
提问于 2025-04-18 13:59

我正在尝试用 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 论坛上找到这个讨论,但我看不出为什么它在我这里不工作,尽管地区设置是正确的。

http://ubuntuforums.org/showthread.php?t=1534940

3 个回答

1

从索引1获取匹配的组

([^\s]+)

在线演示

或者试试

(\S+)

在线演示

根据你期望的输出,使用下面的正则表达式,它会排除空格、点、井号和解释符号。

([^\s\.#!]+)

在线演示


示例代码:

import re
p = re.compile(ur'([^\s]+)')
test_str = u"hej. och gå! Med en #katt som leker 9 liv!"

re.findall(p, test_str)
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+ 就足够了。

撰写回答