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) |