RE的HTML ID值验证

时间:2015-08-04 12:02:29

标签: python regex

问题陈述

  

ID值必须以字母([A-Za-z])开头,后面可以跟任意数量的字母,数字([0-9]),连字符(" - ") ,下划线(" _"),冒号(":")和句号("。")。

我是通过正则表达式完成的。

代码:

>>> import re
>>> id_value1 =  "custom-title1"
>>> id_value2 =  "1-custom-title"
>>> pattern = "[A-Za-z][\-A-Za-z0-9_:\.]*"

有效ID值的代码

>>> flag= False
>>> try:
...     if re.finadll(pattern, id_value1)[0]==id_value1:
...         flag=True
... except:
...     pass
... 
>>> print flag
False

无效ID值的代码:

>>> flag = False
>>> try:
...     if re.findall(pattern, id_value2)[0]==id_value2:
...         flag=True
... except IndexError:
...     pass
... 
>>> print flag
False

IndexError的代码

>>> try:
...     if re.findall(pattern, "")[0]=="":
...         print "In "
... except IndexError:
...    print "Exception Index Error"
... 
Exception Index Error
>>> 

我将在一个函数中移动代码。此功能将调用超过1000次。那么任何人都可以优化上面的代码吗?

2 个答案:

答案 0 :(得分:2)

你应该匹配字符串的结尾,编译你的模式并使用re.match()而不是re.findall()

import re
id_value1 =  "custom-title1"
id_value2 =  "1-custom-title"

pattern = "[A-Za-z][\-A-Za-z0-9_:\.]*$"
compiled = re.compile(pattern)

def validate(id):
    return bool(compiled.match(id))

print validate(id_value1)
print validate(id_value2)

答案 1 :(得分:1)

我有 ID生成。

__init__()函数中我编译模式

def __init__(self): 
  self.id_validation = re.compile("[A-Za-z][\-A-Za-z0-9_:\.]*$")

以下是验证ID生成的类值的函数,因为我们使用HTML Tag的类值来为各个HTML标记生成ID。 示例HTML元素:<div class="custom1 123-custom>

def validateClassNames(self, element_obj):
    """ Remove class names which are ignore in id generation.
        Validate class value according to ID generation rule.
    """
    try:
        class_names = element_obj.attrib["class"]
    except:
        return False, ""
    #- Class value must be Alphabets
    class_list = [class_vlaue for class_vlaue in class_names.split(" ")\
                  if class_vlaue not in self.ignore_values and bool(self.id_validation.match(class_vlaue))]
    #- Return True if have class list.
    if len(class_list) != 0:
        return True, class_list
    return False, ""