我需要用空格替换所有非ascii (\x00-\x7F)字符。我很惊讶,这在Python中不是非常容易的,除非我遗漏了什么。下面的函数简单地删除所有非ascii字符:
def remove_non_ascii_1(text):
return ''.join(i for i in text if ord(i)<128)
这一个替换非ascii字符与空格的数量在字符编码点的字节数(即-字符替换为3个空格):
def remove_non_ascii_2(text):
return re.sub(r'[^\x00-\x7F]',' ', text)
如何用一个空格替换所有非ascii字符?
在无数类似的SO问题中,没有一个是针对字符替换而不是剥离的,另外是针对所有非ascii字符而不是特定字符。
将所有非ascii (\x00-\x7F)字符替换为空格:
''.join(map(lambda x: x if ord(x) in range(0, 128) else ' ', text))
要替换所有可见字符,请尝试以下操作:
import string
''.join(map(lambda x: x if x in string.printable and x not in string.whitespace else ' ', text))
这将给出相同的结果:
''.join(map(lambda x: x if ord(x) in range(32, 128) else ' ', text))
使用Raku(以前称为Perl_6)进行预处理
~$ raku -pe 's:g/ <:!ASCII>+ / /;' file
样例输入:
Peace be upon you
السلام عليكم
שלום עליכם
Paz sobre vosotros
样例输出:
Peace be upon you
Paz sobre vosotros
注意,你可以使用下面的代码获得大量的匹配信息:
~$ raku -ne 'say s:g/ <:!ASCII>+ / /.raku;' file
$( )
$(Match.new(:orig("السلام عليكم"), :from(0), :pos(6)), Match.new(:orig("السلام عليكم"), :from(7), :pos(12)))
$(Match.new(:orig("שלום עליכם"), :from(0), :pos(4)), Match.new(:orig("שלום עליכם"), :from(5), :pos(10)))
$( )
$( )
或者更简单地说,你可以想象一下替换的空格:
~$ raku -ne 'say S:g/ <:!ASCII>+ / /.raku;' file
"Peace be upon you"
" "
" "
"Paz sobre vosotros"
""
https://docs.raku.org/language/regexes#Unicode_properties
https://www.codesections.com/blog/raku-unicode/
https://raku.org
当我们使用ascii()时,它会转义非ascii字符,并且不会正确地更改ascii字符。所以我的主要想法是,它不会改变ASCII字符,所以我在字符串中迭代并检查字符是否被改变。如果它改变了,那就用替代品替换它。
例如:' '(单个空格)或'?(带一个问号)。
def remove(x, replacer):
for i in x:
if f"'{i}'" == ascii(i):
pass
else:
x=x.replace(i,replacer)
return x
remove('hái',' ')
结果:“h i”(中间有一个空格)。
语法:remove(str,non_ascii_replacer)
这里你将给出你想要使用的字符串。
non_ascii_replacer =在这里,您将给出要替换所有非ASCII字符的替换器。
你的" .join()表达式正在过滤,删除任何非ascii的东西;你可以使用条件表达式:
return ''.join([i if ord(i) < 128 else ' ' for i in text])
这将逐个处理字符,并且仍然会使用一个空格替换每个字符。
你的正则表达式应该用空格替换连续的非ascii字符:
re.sub(r'[^\x00-\x7F]+',' ', text)
注意这里的+。