我正在使用Maya中的工具,在某些时候,用户可以在textField上输入注释。此注释稍后将用作将要保存的文件名的一部分。 我在法国工作,因此用户可能会使用一些突出的字符作为“é”或“à” 我喜欢的只是将它们翻译成非突出的相应角色。但是我意识到这非常棘手,所以我可以通过juste检测它们,这样我就可以向用户发出警告信息了。我不想只是删除这些有罪的信件,因为这可能导致评论无法解释 我知道他们在这里有一些类似的问题,但他们都是我不了解/不懂的其他语言(例如C ++或php)。
以下是我到目前为止在网络上发现的内容:
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
这个第一个解决方案不起作用,因为它认为强调的字符是可接受的。
我发现了这个:
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
我想这样使用:
ENGLISH_CHARS = re.compile('[^\W_]', re.IGNORECASE)
if len(ENGLISH_CHARS .findall(comment)) != len(comment):
# issue a warning for the user
但只有字符串封装在下划线中才能起作用。
如果这是我没有找到或理解的东西的副本,我真的很抱歉,但它一直让我疯狂。
答案 0 :(得分:0)
unicode命令尝试以给定的编码对您的字符串进行编码。如果失败,它将默认为ASCII并引发异常。
try:
unicode(filename)
except UnicodeDecodeError:
show_warning()
这只允许不重音的字符,这可能是你想要的。
如果您已有Unicode字符串,则必须更改编码,这将引发UnicodeEncodeError。
filename.encode("ASCII")
示例:
>>> 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)
答案 1 :(得分:0)
看来你实际上有两个问题。
如何发现是否需要从重音字符转换为类似的&#39;来自ASCII。
#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)
如何将它们轻松转换为非重音?你可以设计出很好的通用解决方案,或者你可以只用法语来做,很容易就是这样:
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]