Python 删除带有疯狂符号的行

Python 删除带有疯狂符号的行,python,nlp,preprocessor,Python,Nlp,Preprocessor,我有一个句子列表,我相信其中一些句子的编码是错误的。有些句子现在包含像“hé这样的字符串。我想删除所有的句子,包括那些带有疯狂符号的单词。我已经尝试了下面的代码,这部分起了作用。很多我想删除的句子都被删除了,但不是全部。有什么想法吗 clean_sentences = [] lines_to_erase = [] characters = "éÂ�Ä¢¬" for line in all_data: for char in line: if char

我有一个句子列表,我相信其中一些句子的编码是错误的。有些句子现在包含像“hé这样的字符串。我想删除所有的句子,包括那些带有疯狂符号的单词。我已经尝试了下面的代码,这部分起了作用。很多我想删除的句子都被删除了,但不是全部。有什么想法吗

clean_sentences = []
lines_to_erase = []
characters = "éÂ�Ä¢¬"
for line in all_data:
    for char in line:
      if char in characters:
        lines_to_erase.append(line)
for line in all_data:
    if line not in lines_to_erase:
        clean_sentences.append(line.strip())
len(x)==len(x.encode())

如果字符是通用ascii值,则返回True

使用它,您可以遍历所有字符并返回文本,但不返回非ascii字符

[x for x in arr if len(x) == len(x.encode())]
如果要删除所有包含非ascii字符的句子,请遍历所有行,如果遇到非ascii字符,则不会将其添加到最终列表中

end = []
for x in sentences:
    badchar = false
    for char in x:
        if len(char) == len(char.encode()):
            badchar = True
            break
    if not(badchar): end.append(sentence)

你所做的是试图找出一行是否有“Ô�在里面,没有一个。您可以改为将变量“characters”更改为包含这些字符的列表。比如:

clean_sentences = []
lines_to_erase = []
characters = ["Ã", "©", "Â", "�", "Ä", "¢", "¬"]
for line in all_data:
    for char in line:
      if char in characters:
        lines_to_erase.append(line)
for line in all_data:
    if line not in lines_to_erase:
        clean_sentences.append(line.strip())

因此,在本例中,您需要检查一行是否包含“characters”变量中的任何字符。

如果您使用的是英文文本,则可以使用translate()来检测是否存在不可打印的ascii字符:

import string

invalidChars = str.maketrans('','',string.printable) # remove valid characters

all_data = ["Good line.",
            "Bad éÂ�Ä¢¬ line",
            "Other good line"]

clean_sentences = [line for line in all_data if not line.translate(invalidChars)]

print(*clean_sentences,sep="\n")

Good line.
Other good line
您也可以通过指定无效的字符以另一种方式执行此操作

validChars = str.maketrans('','','éÂ�Ä¢¬')

all_data = ["Good line.",
            "Bad é line with �Ä¢¬ characters",
            "Other good line"]

clean_sentences = [line for line in all_data if line == line.translate(validChars)]

print(*clean_sentences,sep="\n")

Good line.
Other good line

但是,如果文本编码/解码不好,您应该会发现“疯狂符号”总是以相同的2个字符模式开始(其中应该很少有变化)。在这种情况下,最好使用正则表达式。

btw
“\b”
“\r”
“\x00”
都是ascii字符,但不被视为有效字符。是的,这是正确的,因此如果我没有错误地理解
“\x01”
“\x02”,那么在if语句中添加
和“\b\r\x00”
应该有效
。。。?使用
.isprintable