gpt4 book ai didi

python - 如何有效地删除非 ASCII 字符和数字,但保留重音 ASCII 字符

转载 作者:太空宇宙 更新时间:2023-11-03 15:05:02 25 4
gpt4 key购买 nike

我有几个这样的字符串:

s = u'awëerwq\u0645\u0631\u062d\u0628\u0627\u043c\u0438\u0440bròn 1990 23x4 + &23 \'we\' we\'s mexicqué'
s
"awëerwq مرحباмир bròn 1990 23x4 + &23 'we' we's mexicqué"

我找不到一种方法来删除不可打印的内容,如“مرحباми”,但保留拉丁字符,如“óé,...”。在我的情况下,数字(如“1990”)也是不可取的。我使用了 re 中的 ASCII 标志,但我不知道这有什么问题,因为它删除了 'óëé,...'。使用 string.printable 也是同样的问题。不知道为什么

ord('ë')
235

鉴于它被分配了 137 的 ASCII 表。我期望的结果是这样的:

x = some_method(s)
"awëerwq bròn 23x4 we we s mexicqué"

然后,我想编写不依赖于不固定编码的代码。

最佳答案

这里有一个可能有用的方法(Python 3.4):

import unicodedata
def remove_nonlatin(s):
s = (ch for ch in s
if unicodedata.name(ch).startswith(('LATIN', 'DIGIT', 'SPACE')))
return ''.join(s)

>>> s = 'awëerwq\u0645\u0631\u062d\u0628\u0627\u043c\u0438\u0440bròn 1990 23x4 + &23 \'we\' we\'s mexicqué'
>>> remove_nonlatin(s)
'awëerwqbròn 1990 23x4 23 we wes mexicqué'

这会获取字符串中字符的 unicode 名称,并匹配名称以 LATIN、DIGIT 或 SPACE 开头的字符。

例如,这将匹配:

>>> unicodedata.name('S')
'LATIN CAPITAL LETTER S'

这不会:

>>> unicodedata.name('م')
'ARABIC LETTER MEEM'

我有理由相信拉丁字符都有以“LATIN”开头的 unicode 名称,因此这应该过滤掉其他书写脚本,同时保留数字和空格。标点符号没有方便的一行,所以在这个例子中,感叹号等也被过滤掉了。

您大概可以使用类似 ord(c) < 0x250 的代码点进行过滤,虽然你可能会得到一些你意想不到的东西。或者,您可以尝试按 unicodedata.category 进行过滤.但是,“字母”类别包括来自许多脚本的字母,因此您最终仍会得到其中一些:“م”。

关于python - 如何有效地删除非 ASCII 字符和数字,但保留重音 ASCII 字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33850619/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com