Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/342.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何删除大型法语文本文件中的所有特殊字符_Python_Regex_Bash_Unicode_Data Cleaning - Fatal编程技术网

Python 如何删除大型法语文本文件中的所有特殊字符

Python 如何删除大型法语文本文件中的所有特殊字符,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), ''

给定一个用UTF-8编码并用unicode
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