Глупый мой. Решение было так просто.
Вместо:
class TREE_OT_assign(bpy.types.Operator):
names = bpy.props.EnumProperty(items=get_items(), update=update())
def invoke(self, context, event):
Просто используйте:
class TREE_OT_assign(bpy.types.Operator):
def get_items(........
def update(.........
names = bpy.props.EnumProperty(items=get_items, update=update)
def invoke(self, context, event):
Я пробовал это раньше, но я поместил определение методов ниже определения переменной «names»: /
Я бы просто перечислил белый список символов.
^[a-zA-Z0-9äöüÄÖÜ]*$
Создание черного списка одинаково просто с регулярным выражением, но вам может понадобиться чтобы добавить намного больше символов - в юникоде много китайских символов ...;)
^[^<>%$]*$
Выражение [^ (здесь много символов)] просто соответствует любому символу, которого нет в списке.
Чтобы исключить определенные символы (<,>,% и $), вы можете создать регулярное выражение, например:
[<>%\$]
Это регулярное выражение будет соответствовать всем входным данным, в которых есть черный список символов. Скобки определяют класс символов, и перед знаком доллара необходимо указывать символ \, потому что знак доллара имеет особое значение в регулярных выражениях.
Чтобы добавить больше символов в черный список, просто вставьте их в скобки; порядок не имеет значения.
Согласно некоторой документации Java для регулярных выражений , вы можете использовать выражение следующим образом:
Pattern p = Pattern.compile("[<>%\$]");
Matcher m = p.matcher(unsafeInputString);
if (m.matches())
{
// Invalid input: reject it, or remove/change the offending characters.
}
else
{
// Valid input.
}
Обычно лучше использовать разрешенные символы белого списка, чем запрещенные символы черного списка. как с точки зрения безопасности, так и с точки зрения простоты реализации.
Если вы пойдете по черному списку, вот пример, но будьте осторожны, синтаксис не прост.
http: // groups. google.com/group/regex/browse_thread/thread/0795c1b958561a07
Если вы хотите добавить в белый список все символы ударения, возможно, использование диапазонов Юникода поможет? Проверьте эту ссылку.
Я думаю, это зависит от того, на какой язык вы ориентируетесь. В общем, что-то вроде этого должно работать:
[^<>%$]
Конструкция «[]
» определяет класс символов, который будет соответствовать любому из перечисленных символов. Помещение « ^
» в качестве первого символа отменяет совпадение, т. Е. Любой символ ДРУГОЙ, чем один из перечисленных.
Вам может понадобиться экранировать некоторые символы в пределах «[]
», в зависимости от на каком языке / движке регулярных выражений вы используете.
Вы действительно хотите занести в черный список определенные символы или, скорее, внести в белый список разрешенные символы?
Я предполагаю, что Вы действительно хотите последнее. Это довольно просто (добавьте любые дополнительные символы в белый список в группу [\ -]
):
^(?:\p{L}\p{M}*|[\-])*$
Редактировать: Оптимизировать шаблон с учетом комментариев из комментариев
Почему вы считаете регулярное выражение лучшим инструментом для этого? Если ваша цель - определить, присутствует ли в строке недопустимый символ, тестирование каждого символа в цикле будет проще и эффективнее, чем построение регулярного выражения.
Я сильно подозреваю, что будет проще составить список символов, которые разрешены против тех, которые разрешены это не так - и как только у вас есть этот список, синтаксис регулярных выражений становится довольно простым. Так что опустите меня как еще один голос за "белый список".
Вот все символы с французским акцентом: àÀâÂäÄáÁéÉèÈêÊëËìÌîïÏòÒôÔöÖùÙûÛüÜçÇ'ñ
Я бы погуглил список символов с немецким акцентом. Их не так уж и много. Вы должны получить их все.
Для URL-адресов я заменяю URL-адреса с диакритическими знаками обычными буквами, например так:
string beforeConversion = "àÀâÂäÄáÁéÉèÈêÊëËìÌîÎïÏòÒôÔöÖùÙûÛüÜçÇ’ñ";
string afterConversion = "aAaAaAaAeEeEeEeEiIiIiIoOoOoOuUuUuUcC'n";
for (int i = 0; i < beforeConversion.Length; i++) {
cleaned = Regex.Replace(cleaned, beforeConversion[i].ToString(), afterConversion[i].ToString());
}
Возможно, есть более эффективный способ.