3

我正在尝试使用Python regular expression来验证变量的值。

验证规则如下:

  • 该值可以包含任何a-z, A-Z,0-9*(no blank, no -, no ,)
  • 该值可以start带有数字(0-9)或字母(a-z, A-Z)*
  • 该值可以end带有数字(0-9)或字母(a-z, A-Z)*
  • 在中间,值可以包含数字(0-9)或字母(a-z, A-Z)*
  • 不得允许任何其他值

目前我正在使用以下代码片段进行验证:

import re
data = "asdsaq2323-asds"
if re.compile("[a-zA-Z0-9*]+").match(data).group() == data:
    print "match"
else:
    print "no match"

我觉得应该有更好的方法来完成上述工作。我正在寻找类似以下的内容:

validate_func(pattern, data) 
/* returns data if the data passes the validation rules */
/* return None if the data does not passes the validation rules */
/* should not return part of the data which matches the validation rules */

是否存在这样一种内置功能?

4

3 回答 3

6

在正则表达式中,元字符^$表示“字符串开头”和“字符串结尾”(分别);因此,与其查看匹配的内容并将其与整个字符串进行比较,不如简单地要求正则表达式匹配整个字符串以开头:

import re
data = "asdsaq2323-asds"
if re.compile("^[a-zA-Z0-9*]+$").match(data):
    print "match"
else:
    print "no match"

此外,由于您只使用了一次正则表达式——您编译它并立即使用它——您可以使用方便的方法re.match将其作为一个步骤来处理:

import re
data = "asdsaq2323-asds"
if re.match("^[a-zA-Z0-9*]+$", data):
    print "match"
else:
    print "no match"
于 2013-03-22T22:43:20.763 回答
3

要确保整个字符串与您的模式匹配,请在您的正则表达式中使用字符串锚点的开头和结尾。例如:

regex = re.compile(r'\A[a-zA-Z0-9*]+\Z')
if regex.match(data):
    print "match"
else:
    print "no match"

使它成为一个函数:

def validate_func(regex, data):
    return data if regex.match(data) else None

例子:

>>> regex = re.compile(r'\A[a-zA-Z0-9*]+\Z')
>>> validate_func(regex, 'asdsaq2323-asds')
>>> validate_func(regex, 'asdsaq2323asds')
'asdsaq2323asds'

作为旁注,我更喜欢\A这样\Z的验证,^并且可以根据使用的标志而改变,并且将在字符串末尾的换行符之前匹配。$^$$

于 2013-03-22T22:43:27.987 回答
2

我想你正在寻找

re.match('^[a-zA-Z0-9*]+$',data) and data

额外and data的只是返回数据,但我不确定你为什么需要它。检查 re.match 结果与 None 足以检查字符串是否有效。

于 2013-03-22T22:41:14.127 回答