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

2024-10-01 05:03:15 发布

您现在位置:Python中文网/ 问答频道 /正文

我有几根这样的弦:

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”)是不可取的。我使用了来自reASCII标志,但我不知道这有什么问题,因为它删除了“óé,…”。使用string.printable也是同样的问题。 我不知道为什么

^{pr2}$

鉴于ASCII表,它被指定为137。我预期的结果是这样的:

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

那么,我希望代码不依赖于不固定的编码。在


Tags: 方法brasciiweawu0438u0627u043c
2条回答

下面是一种可能有帮助的方法(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名称,并匹配名称以拉丁语、数字或空格开头的字符。在

例如,这将匹配:

^{pr2}$

这不会:

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

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

您大概可以通过使用ord(c) < 0x250这样的代码点进行过滤,尽管您可能会得到一些您意想不到的结果。或者,您可以尝试按^{}进行筛选。然而,“字母”类别包含了很多脚本的字母,所以你最终还是会得到一些这样的字母:“م”。在

I have used ASCII flag from re but I don't know what's wrong with that because it removes 'óëé,...'.

我认为你的问题问错了。ASCII中没有字符óëé。请看一下这里的所有ASCII字符集,看看它有多基本:

https://en.wikipedia.org/wiki/ASCII#ASCII_printable_code_chart

您使用的字符串似乎是Unicode格式的,因为它可以同时支持“محباми”和“ëé”。在

在这种情况下,可以使用

http://jrgraphix.net/research/unicode_blocks.php

并且只包括拉丁语(这将过滤掉阿拉伯语字符)。在

下面是一个例子:

import re
s = u"مرحباми123"

# prints "123" by keeping all characters from the following ranges:
# 0020 — 007F   Basic Latin
# 00A0 — 00FF   Latin-1 Supplement
# 0100 — 017F   Latin Extended-A
# 0180 — 024F   Latin Extended-B
print ''.join(re.findall(ur'[\u0020-\u007F\u00A0-\u00FF\u0100-\u017F\u0180-\u024F]+', s))

相关问题 更多 >