仅保留字符串中的字母字符(多语言)

12

在stackoverflow上有很多关于如何从字符串中仅保留字母字符的答案,最常见的被接受的是著名的正则表达式'[^a-zA-Z]'。但这个答案是完全错误的,因为它假定所有人都只写英文...我想我可以对所有这些答案进行投票否定,但我最终认为重新提问会更有建设性,因为我找不到答案。

在Python中是否有一种易于(或不易于)的方法,可以仅保留字符串中的字母字符,并适用于所有语言?我想可能有一个类似于javascript中的xregexp的库...我所说的所有语言包括英语,但也包括法语、俄语、汉语、希腊语等等。


3
我认为包含整个Unicode并排除非字母字符可能会更容易。 - Moon Cheesez
@MoonCheesez 我也是这么想的。在 shell 脚本中有一种简单的方法可以做到这一点,但我现在想不出一个 Pythonic 的方法。 - Sam Chats
1个回答

10

[^\W\d_]

使用Python3或Python2中的re.UNICODE标志,您可以使用[^\W\d_]

\W:如果设置了UNICODE,则匹配除[0-9_]之外的任何内容,以及在Unicode字符属性数据库中未分类为字母数字的字符。

因此,[^\W\d_]表示除非不是字母数字字符、不是数字或下划线,否则可以匹配任何字符。换句话说,它匹配任何字母字符。 :)

>>> import re
>>> re.findall("[^\W\d_]", "jüste Ä tösté 1234 ßÜ א д", re.UNICODE)
['j', 'ü', 's', 't', 'e', 'Ä', 't', 'ö', 's', 't', 'é', 'ß', 'Ü', 'א', 'д']

先删除数字,再查找"\w"

为避免使用这种复杂的逻辑,您也可以首先删除数字和下划线,然后查找字母数字字符:

>>> without_digit = re.sub("[\d_]", "", "jüste Ä tösté 1234 ßÜ א д", re.UNICODE) 
>>> re.findall("\w", without_digit, re.UNICODE)
['j', 'ü', 's', 't', 'e', 'Ä', 't', 'ö', 's', 't', 'é', 'ß', 'Ü', 'א', 'д']

正则表达式模块

看起来regex模块可以帮忙,因为它理解\p{L}[\w--\d_]

该正则表达式实现与标准的're'模块向后兼容,但提供了额外的功能。

>>> import regex as re
>>> re.findall("\p{L}", "jüste Ä tösté 1234 ßÜ א д", re.UNICODE)
['j', 'ü', 's', 't', 'e', 'Ä', 't', 'ö', 's', 't', 'é', 'ß', 'Ü', 'א', 'д']

(使用Anaconda Python 3.6进行测试)

我尝试了regex模块和\p{L},它似乎只保留没有重音的拉丁字母...也许我错过了什么地方,但根据文档示例应该可以工作:[\p{L}--QW] # 包含除‘Q’和‘W’之外的所有字母的集合 - Laurent
1
看起来你的第一个和第二个例子都完美运行了 :) - Laurent
我使用的是2.7.9版本。尝试过3版本,但在尝试导入通过pip安装的regex时出现了问题。由于我不是Python专家,也不想花太多时间尝试导入regex,所以我选择了2.7.9版本进行测试。 - Laurent
我标记为答案,但对于正则表达式模块的解决方案仍有一些疑虑,因为根据我尝试的情况,它只保留了没有重音的字母(在 Python 2.7.9 中测试)。 - Laurent
我对Python还比较新,所以需要时间来测试这个。 我尝试了这段代码,但输出只有拉丁字母。# -*- coding: UTF-8 -*- re.UNICODE print (re.findall("[\p{L}]","jüste Ä tösté 1234 ßÜ א д")) - Laurent
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接