问题陈述:
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次。那么任何人都可以优化上面的代码吗?
答案 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, ""