如何去除非ASCII字符但保留句点和空格?
如何去除非ASCII字符但保留句点和空格?
我正在处理一个.txt文件。我想要从文件中得到一个没有非ASCII字符的字符串。然而,我想要保留空格和句号。目前,我也在去除这些字符。以下是代码:
def onlyascii(char): if ord(char) < 48 or ord(char) > 127: return '' else: return char def get_my_string(file_path): f=open(file_path,'r') data=f.read() f.close() filtered_data=filter(onlyascii, data) filtered_data = filtered_data.lower() return filtered_data
我应该如何修改onlyascii()函数来保留空格和句号?我想这不是太复杂,但我无法想出解决方法。
文章标题:如何去除非ASCII字符但保留句点和空格?
问题原因:问题的提出者想要去除字符串中的非ASCII字符,但同时又希望保留句点和空格。
解决方法:根据给出的解决方案,可以使用正则表达式的sub方法来实现。具体代码如下:
import re re.sub(r'[^\x00-\x7f]',r'', your-non-ascii-string)
该方法可以在不使用filter和lambda函数的情况下更快地完成字符替换操作。更多示例可以在这里找到。
需要注意的是,这个解决方案只能满足问题提出者的要求,但不能移除包含在ASCII中的非打印字符,这可能是问题提出者实际想要问的。
问题:如何删除非ASCII字符,但保留句点和空格?
原因:用户想要删除字符串中的非ASCII字符,但是句点和空格需要保留。用户已经尝试了使用string.printable过滤字符的方法,但出现了一些问题。
解决方法:用户可以使用以下方法来过滤掉不可打印的字符:
s = "some\x00string. with\x15 funny characters" import string printable = set(string.printable) filter(lambda x: x in printable, s)
在这个例子中,用户定义了一个字符串s,其中包含一些非ASCII字符。然后,用户导入了string模块,并使用string.printable创建了一个可打印字符的集合printable。用户使用filter函数和lambda表达式来过滤掉s中不在printable集合中的字符。
然而,在Python 3中,filter函数返回一个可迭代对象,而不是字符串。所以,用户需要使用''.join()方法来将过滤后的字符重新组合成字符串。
除了使用filter函数,用户还可以尝试使用正则表达式来过滤非ASCII字符:
import re re.sub(r'[^\x00-\x7f]',r'', your-non-ascii-string)
这种方法在兼容性方面更好,并且在一些情况下可能比使用filter函数更快。
另外,用户提到在处理大文件时,使用上述方法会非常慢。对此,其他用户建议用户创建一个string.printable的集合,并重复使用该集合进行过滤。此外,建议用户将文件分成8K-512K大小的块进行处理,而不是一次性对整个文件进行过滤。
最后,有用户提到在使用filter函数时,会出现PyLint的警告。因此,用户可以使用列表推导式来替代filter函数,例如:
''.join(x for x in s if x in printable)
这种方法可能与filter函数的效果相同,但需要根据具体情况进行性能测试。
本文介绍了一种过滤字符串中非ASCII字符的方法。用户可以使用filter函数和lambda表达式,或者使用正则表达式来实现这个目标。此外,用户还可以通过创建一个字符集合,并重复使用该集合来提高处理大文件时的效率。
问题的原因是需要将非ASCII字符删除,但保留句点和空格。解决方法是使用encode()或decode()函数来更改编码方式。
在Python 2中,可以使用以下代码将Unicode字符串转换为ASCII字符串并删除非ASCII字符:
s = u'Good bye in Swedish is Hej d\xe5' s = s.encode('ascii', errors='ignore') print s
在Python 3中,可以使用以下代码将str类型转换为bytes类型,并删除非ASCII字符:
"Hej då".encode("ascii", errors="ignore").decode()
如果需要将str类型转换为unicode类型,并删除非ASCII字符,可以使用以下代码:
u"hej då".encode("ascii", errors="ignore").decode()
如果需要将unicode类型转换为str类型,并删除非ASCII字符,可以使用以下代码:
"hej d\xe5".decode("ascii", errors="ignore").encode()
如果在将Unicode字符放入字符串中时出现UnicodeDecodeError错误,可以尝试使用u'字符串'的格式来指定字符串。另外,需要注意的是,在Python 2中,应先使用.decode()将字符串解码,然后再使用.encode()进行编码。
还有一种更简洁的方法是先使用.decode()解码字符串,然后再使用.encode()进行编码:
s.decode('utf-8').encode('ascii', errors='ignore')
这种方法只适用于Python 3。
总结起来,要删除非ASCII字符但保留句点和空格,可以使用encode()或decode()函数来更改编码方式,并指定errors='ignore'参数来忽略不支持的字符。对于Python 2和Python 3,具体的代码略有不同,但原理相同。