删除特殊字符但不带重音字母

时间:2019-05-23 17:02:27

标签: python nlp diacritics

我执行以下操作:

re.sub(r'[^ \nA-Za-z0-9/]+', '', document)

删除所有不是字母数字,空格,换行符或正斜杠的字符。

所以我基本上想删除除换行符和正斜杠之外的所有特殊字符。

但是,我不想删除法语,德语等各种语言的重音字母。

但是如果我运行上面的代码,那么例如

Motörhead

成为

Motrhead

我不想这样做。

那么我如何运行上面的代码但又不删除带重音的字母?

更新:

@MattM在下面提出了一种解决方案,该解决方案确实适用于英语,法语,德语等语言,但对于波兰语等仍删除所有重音字母的语言肯定不起作用。

2 个答案:

答案 0 :(得分:2)

我很确定这可以满足您的需求

x = re.sub(r'[^ \nA-Za-z0-9À-ÖØ-öø-ÿ/]+', '', 'Motörhead')

check here讨论有关javascript regex的问题,尽管有differences

,它仍具有一些相关信息

编辑-

要扩展Poete Maudit的新关注-是的,您可以包含非拉丁字符。但是,它可能变得太麻烦了。如果您查看的是list of Unicode chars,则其中包括各种带重音符号的拉丁字符。因此,如果您还想包括所有西里尔字母,我们将Ѐ-ӿ添加到正则表达式中。

import re

yourString = 'Cyrillic Char Ѥ'
yourString = re.sub(r'[^ \nA-Za-z0-9À-ÖØ-öø-ÿЀ-ӿ/]+', '', yourString)
text_file = open("Output.txt", "wb")
text_file.write(yourString.encode('utf8'))
text_file.close()

但是,使用此方法时,您可能必须包括多个范围,具体取决于您想要或不想要哪种字符。

答案 1 :(得分:0)

您也许还可以修改字符编码。我不知道您是否使用utf-8。我以某种方式在utf8中安装了python文件(我使用Windows和YMMV,但)

#coding: iso-8859-1
import re

x = "Mötörhead MÖTÖRHEAD"

y = re.sub(r'[^\xe0-\xff]', '', x)
print(y, "only keeps accented lower-case characters from", x)
z = re.sub(r'[^\xc0-\xff]', '', x)
print(z, "keeps all accented characters from", x)

第一个注释行很重要。没有它,python会为我抛出编码错误。

如果要调整您特别想要的字符的十六进制值,则可以使用Windows Charmap(Windows西方字符集)。 xc0是大写字母重音字符的开头。但是,如果您只想敲击特定的字符或元音,则Matt M的代码更具可读性。我的挖角,因为它还消除了分隔符号(0xf7)和乘法(0xd7)。

相关问题