Python 如何删除大型法语文本文件中的所有特殊字符
给定一个用UTF-8编码并用unicodePython 如何删除大型法语文本文件中的所有特殊字符,python,regex,bash,unicode,data-cleaning,Python,Regex,Bash,Unicode,Data Cleaning,给定一个用UTF-8编码并用unicodeNFC标准化的法语(>200GB)大文本文件,我想使用Python或Bash或任何更快的方法删除所有特殊字符,除了重音/非重音字母、数字和标点符号。以前,我通过扫描文本来手动执行此任务,以确定是否存在我不需要的特殊字符,并使用如下字符代码将其删除: def remove_special_chars(text): text = re.sub(chr(65533), '', text) text = re.sub(chr(9658), ''
NFC
标准化的法语(>200GB)大文本文件,我想使用Python或Bash或任何更快的方法删除所有特殊字符,除了重音/非重音字母、数字和标点符号。以前,我通过扫描文本来手动执行此任务,以确定是否存在我不需要的特殊字符,并使用如下字符代码将其删除:
def remove_special_chars(text):
text = re.sub(chr(65533), '', text)
text = re.sub(chr(9658), '', text)
text = re.sub(chr(9660), '', text)
text = re.sub(chr(169), '', text)
return text
� (字符代码65533)► (字符代码9658)▼ (字符代码9660))(字符代码169)等
然而,对于一个大的文本文件,它不可能再这样做了。因此,我想通过检查一个字符是否是(重音/非重音)字母、数字或标点符号来删除所有特殊字符,如果不是,则删除。我尝试了以下操作,但命令行没有执行
grep -P -v '[^a-zA-Z0-9 àâäèéêëîïôœùûüÿçÀÂÄÈÉÊËÎÏÔŒÙÛÜŸÇ!"#\$%&\'\(\)\*\+,\\-\./:;<=>\?@\[\]\^_`\{\|\}\~]' file
grep-P-v'[^a-zA-Z0-9\\$%和\(\)*\+,\/::?\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
您能帮我解决这个问题吗?提前谢谢您的帮助!我假设您的文本使用的是法裔加拿大人的代码页,即
cp863
。不使用regex可以使用的一种“hacky”方法如下所示
# this ignores any characters that are not in the standard french character page
text = "abcdeefghijkàâäèéêëîïôœùûüÿçÀÂÄÈÉÊËÎÏÔ►�▼©".encode("cp863", "ignore")
print(text.decode('cp863'))
# outputs
abcdeefghijkàâèéêëîïôùûüçÀÂÈÉÊËÎÏÔ
一切都属于世界
在Python中,您可以安装、添加
然后更改如下内容:
text = regex.sub(r'\p{So}+', '', text)
在Linux中,您可以使用Perl一行程序来实现这一点:
perl -i -CSD -Mutf8 -pe 's/\p{So}+//g' file
-i
选项将内联修改文件,-CSD-Mutf8
在那里,因为我相信您的文件是UTF8编码的。我将使用unicodedata
模块,这是一个标准模块,因此它应该已经在您的系统中
您应该使用unicodedata.category(
chr
)
循环每个字符,并检查要保留或放弃的类别
Unicode发布常规类别值:
我会保留L*
(字母)、N*
(数字)、p*
(标点符号)和Zs
(空格)。我会将其他Z*
更改为空格,我会将其他字符也更改为空格,但也会将行保存到文件中,以检查是否需要修改规则
注意:您还可以根据自己的使用限制/转换其他代码(例如,将左括号转换为普通括号等)
注:上述建议还将删除
$
(货币符号),您可以对其进行调整。可能是sed、[^[:alnum:[:punct:][]、g'file>newfile
?@WiktorStribiżew,但[:alnum:]
包括非重音字符,如a-z
和a-z
,而文本是法语的,因此我也需要重音字符,如èèèèèè…
。因此,该命令将保留所有字母、数字、标点和文字空间。您的grep
命令看起来就是在这种情况下编写的。您认为呢如果你尝试“<代码> SED”y/AsAyEythySuxEythySuthyOrth.AuthOythySux.A/AAACEIOIIOUIAUAACEIEIOUUN/''$FILIN > $FILUOUT ,这就是我使用的法语iPIPTI认为相反的是更容易:提取不是特殊字符的所有东西。呃,你可以使用更简单的正则表达式。也可以看看nltk库,它有nltk.tokenize.RegexpTokenizer
方法。非常感谢!!!我试着为\p{so}应用Unicode正则表达式
使用sed、grep、perl
但直到我尝试了你的解决方案才成功。可能是因为我没有像你的答案中那样使用-CSD、-Mutf8、-pe
选项。非常感谢!这是一个非常有趣的解决方案,在其他问题上对我很有帮助。但是,我接受了Wiktor的答案,因为我认为它更具体于我的问题(通过某些类别定义要删除的特殊字符),并且可以通过检查相应的Unicode类别来修改它以删除我们不需要的其他字符。我对您的答案和您的另一个答案进行了投票:)。@Sophil不用担心!您可以自由接受任何您想要的答案:)谢谢!无论如何,我发现您的解决方案很有趣,也很有帮助!:)谢谢你!我也会试试你的建议。
perl -i -CSD -Mutf8 -pe 's/\p{So}+//g' file