用单个空格替换非ASCII字符

325

我需要将所有非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字符而不是特定字符。


74
哇,你真的花了很多心思展示这么多链接。一旦新的一天开始,我会点赞加一! - shad0w_wa1k3r
3
你好像错过了这个问题:https://dev59.com/mHM_5IYBdhLWcg3whznx - Stuart
8
@Stuart:谢谢,但那正是我提到的第一个。 - dotancohen
1
@dstromberg:我在问题中提到了一个有问题的字符示例:“–”。 这是 - dotancohen
1
在这个问题的生命周期的这个阶段,也许即使它们不是正题,sedawkperl的答案也很有趣。但我建议将它们放在一个统一的“X/Y答案”中,而不是分开回答。通常情况下,如果代码是从例如bash CLI运行的地方(其中四个都通常可用),而不是实际运行Python脚本的地方,sedawkperl的答案可以替代Python答案。 - dotancohen
显示剩余5条评论
12个回答

-1

将所有非 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))

-1
潜在的是一个不同的问题,但我提供了我的版本@Alvero的答案(使用unidecode)。 我想对我的字符串进行“常规”剥离,即将我的字符串的开头和结尾用于空格字符,然后仅将其他空格字符替换为“常规”空格,即。
"Ceñíaㅤmañanaㅤㅤㅤㅤ"

"Ceñía mañana"

,

def safely_stripped(s: str):
    return ' '.join(
        stripped for stripped in
        (bit.strip() for bit in
         ''.join((c if unidecode(c) else ' ') for c in s).strip().split())
        if stripped)

我们首先将所有非Unicode空格替换为普通空格(然后再将其连接在一起),

''.join((c if unidecode(c) else ' ') for c in s)

然后我们再次使用Python的正常分割(split)函数进行拆分,并去除每个“片段”的空格。

(bit.strip() for bit in s.split())

最后,将它们重新连接起来,但仅当字符串通过一个if测试时。
' '.join(stripped for stripped in s if stripped)

有了这个,safely_stripped('ㅤㅤㅤㅤCeñíaㅤmañanaㅤㅤㅤㅤ') 将正确返回 'Ceñía mañana'


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接