python re.search返回None和Object

时间:2015-03-04 21:49:40

标签: python regex django

我在这样的utils文件中有一个方法

def validate_string(string):
    regex = r"^[a-zA-Z-_áéíóúÁÉÍÓÚÑñ][a-zA-Z0-9-_áéíóúÁÉÍÓÚÑñ\s]*$"
    # return True if re.search(regex, string) else False
    if re.search(regex, string):
        return True
    else:
        return False

我在Django类基础视图中使用它来验证一些输入字段

class ClassBassedView(View):
    def post(self, request, *args, **kwargs):
            name = self.request.POST['menu_new_name']
            description = self.request.POST['menu_new_description']
            fields = [[name, "El nombre"], [description, "La descripcion"]]
            re_error = False

            for item in fields:
                if re.search("[!#%&;]", item[0]):
                    re_error = "{0} no puede contener los caracteres #, !, ;, % o &.".format(item[1])
                    break
                elif validate_string(item[0]) is False:
                    print "(%s) (%s)" % (item[0], validate_string(item[0]))
                    re_error = "{0} solo puede contener letras, numeros y guiones medios y bajos. No puede iniciar con"\
                               " numeros.".format(item[1])
                    break

然后,例如,当我运行此视图时,我发送帖子值:

{'menu_new_name': "Hello", 'menu_new_description': "Éstíló"}

我得到了印刷品:

(Éstíló) (False)

但是当我从shell运行时

python manage.py shell 

我明白了:

>>> from dathLog.utils import validate_string
>>> s = 'Éstíló'
>>> validate_string(s)
True
>>>
>>> import sys
>>> sys.version
'2.7.6 (default, Sep  9 2014, 15:04:36) \n[GCC 4.2.1 Compatible Apple LLVM 6.0 (clang-600.0.39)]'

我的正则表达式有问题吗?

1 个答案:

答案 0 :(得分:2)

使用Python 2.x如果使用国家字符,则应将正则表达式指定为unicode:

regex = ur"^[a-zA-Z-_áéíóúÁÉÍÓÚÑñ][a-zA-Z0-9-_áéíóúÁÉÍÓÚÑñ\s]*$"

并在shell上测试时使用以下格式:

s = u'Éstíló'