关于maya:如何在python中检测字符串上的ASCII字符

How to detect ASCII characters on a string in python

本问题已经有最佳答案,请猛点这里访问。

我正在使用玛雅的一个工具,在这个工具中,用户可以在文本字段上输入注释。此注释稍后将用作要保存的文件名的一部分。我在法国工作,所以用户可能会使用一些突出的字符作为"_"或"_"。我想要的是把它们翻译成它们不突出的对应字符。然而,我意识到这是非常棘手的,所以我会同意Juste检测它们,以便我可以向用户发出警告消息。我不想仅仅删除那些被指控的信件,因为这可能会导致评论不可辩驳。我知道他们在这里有一些类似的问题,但是它们都是我不知道的其他语言(如C++或PHP)。

以下是迄今为止我在网上发现的:

1
2
3
4
import re
comment = 'something written with some french words and numbers'
if re.match(r'^[A-Za-z0-9_]+$', text):
    # issue a warning for the user

第一个解决方案不起作用,因为它认为强调字符是可以接受的。

我发现这一点:

1
2
3
4
5
ENGLISH_CHARS = re.compile('[^\W_]', re.IGNORECASE)
ALL_CHARS = re.compile('[^\W_]', re.IGNORECASE | re.UNICODE)

assert len(ENGLISH_CHARS.findall('_à??_')) == 0
assert len(ALL_CHARS.findall('_à??_')) == 3

我想用这个:

1
2
3
ENGLISH_CHARS = re.compile('[^\W_]', re.IGNORECASE)
if len(ENGLISH_CHARS .findall(comment)) != len(comment):
    # issue a warning for the user

但似乎只有当字符串被封装在下划线中时才有效。

我真的很抱歉,如果这是我没有发现或理解的东西的复制品,但它让我抓狂了。


你好像有两个问题。

  • 如何发现是否需要从重音字符转换为"类似"的ASCII字符。

    1
    2
    3
    4
    5
    6
    7
    8
    #coding: utf-8
    import string
    text = u"Montréal, über, 12.89, Mère, Fran?oise, no?l, 889"
    allowed_letters = string.printable
    name_has_accented = [letter for letter in text if not letter in allowed_letters]
    if name_has_accented:
        text ="".join(convert(text))
    print(text)
  • 如何轻松地将它们转换为无重音?你可以设计出很好的通用解决方案,也可以只为法语设计,很容易做到这一点:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    def convert(text):
        replacements = {
            u"à":"a",
            u"?":"o",
            u"é":"e",
            u"ü":"u",
            u"?":"c",
            u"?":"e",
            u"è":"e",
        }
        def convert_letter(letter):
            try:
                return replacements[letter]
            except KeyError:
                return letter
        return [convert_letter(letter) for letter in text]

  • unicode命令尝试用给定的编码对字符串进行编码。它将默认为ASCII,并在失败时引发异常。

    1
    2
    3
    4
    try:
        unicode(filename)
    except UnicodeDecodeError:
        show_warning()

    这只允许非中心字符,这可能是你想要的。

    如果您已经有了Unicode字符串,则必须更改编码,这将导致unicodeencode错误。

    1
    filename.encode("ASCII")

    例子:

    1
    2
    3
    4
    >>> unicode("??")
    Traceback (most recent call last):
      File"<stdin>", line 1, in <module>
    UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 0: ordinal not in range(128)