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